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

Artifact 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 23 69 66 64 65 66  hods!=0)..#ifdef
97b0: 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
97c0: 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 2f 2a 0a  VERFLOW_READ./*.
97d0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
97e0: 66 20 70 61 67 65 20 70 67 6e 6f 20 63 61 6e 20  f page pgno can 
97f0: 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
9800: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
9810: 73 65 20 66 69 6c 65 0a 2a 2a 20 62 79 20 74 68  se file.** by th
9820: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e 20  e b-tree layer. 
9830: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
9840: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   if:.**.**   * t
9850: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9860: 20 69 73 20 6f 70 65 6e 2c 0a 2a 2a 20 20 20 2a   is open,.**   *
9870: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
9880: 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
9890: 20 63 61 63 68 65 2c 20 61 6e 64 0a 2a 2a 20 20   cache, and.**  
98a0: 20 2a 20 74 68 65 20 64 65 73 69 72 65 64 20 70   * the desired p
98b0: 61 67 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  age is not curre
98c0: 6e 74 6c 79 20 69 6e 20 74 68 65 20 77 61 6c 20  ntly in the wal 
98d0: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
98e0: 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74 52  ite3PagerDirectR
98f0: 65 61 64 4f 6b 28 50 61 67 65 72 20 2a 70 50 61  eadOk(Pager *pPa
9900: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9910: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
9920: 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29  d->pMethods==0 )
9930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
9940: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 49 73   sqlite3PCacheIs
9950: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9960: 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 20  Cache) ) return 
9970: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
9980: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
9990: 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b   pPager->pWal ){
99a0: 0a 20 20 20 20 75 33 32 20 69 52 65 61 64 20 3d  .    u32 iRead =
99b0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   0;.    int rc;.
99c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
99d0: 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
99e0: 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
99f0: 20 26 69 52 65 61 64 29 3b 0a 20 20 20 20 72 65   &iRead);.    re
9a00: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
9a10: 5f 4f 4b 20 26 26 20 69 52 65 61 64 3d 3d 30 29  _OK && iRead==0)
9a20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
9a30: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
9a40: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
9a50: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20 64 65 66  E_OMIT_WAL.# def
9a60: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9a70: 78 29 20 28 28 78 29 2d 3e 70 57 61 6c 21 3d 30  x) ((x)->pWal!=0
9a80: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9a90: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
9aa0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9ab0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
9ac0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
9ad0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
9ae0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9af0: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9b00: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9b10: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9b20: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9b30: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9b40: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9b50: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9b60: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9b70: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9b80: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
9b90: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
9ba0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
9bb0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
9bc0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
9bd0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
9be0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9bf0: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9c00: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9c10: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9c20: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9c30: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9c40: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9c50: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9c60: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9c70: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9c80: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
9c90: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9ca0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
9cb0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9cc0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
9cd0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9ce0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9cf0: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9d00: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9d10: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9d20: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9d30: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9d40: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9d50: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9d60: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9d70: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9d80: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
9d90: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
9da0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
9db0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
9dc0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
9dd0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
9de0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9df0: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9e00: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9e10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9e20: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9e30: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9e40: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9e50: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9e60: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9e70: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9e80: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9ea0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
9eb0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9ec0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
9ed0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
9ee0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9ef0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9f00: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9f10: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9f20: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9f30: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9f40: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9f50: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9f60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9f70: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9f80: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9f90: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9fa0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9fb0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9fc0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9fd0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9fe0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9ff0: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
a000: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
a010: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
a020: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
a030: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
a040: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
a050: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
a060: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
a070: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
a080: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
a090: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
a0a0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
a0b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
a0c0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
a0d0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
a0e0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
a0f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
a100: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
a110: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
a120: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a130: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
a140: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
a150: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
a160: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
a170: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
a180: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
a190: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
a1a0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
a1b0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
a1c0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
a1d0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
a1e0: 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20  en(p->fd) );.   
a1f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
a200: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
a210: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
a220: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a230: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a240: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a250: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a260: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
a270: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
a280: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
a290: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
a2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
a2b0: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
a2c0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
a2d0: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
a2e0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
a2f0: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
a300: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
a310: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
a320: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
a330: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
a340: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
a350: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
a360: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
a370: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a380: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
a390: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
a3a0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
a3b0: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
a3c0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
a3d0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
a3e0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
a3f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a400: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a410: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a420: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a430: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a440: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
a450: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
a460: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
a470: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a480: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
a490: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4a0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a4b0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a4c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a4d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a4f0: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
a500: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
a510: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a520: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
a530: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a540: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a550: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a560: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a570: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a580: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a590: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a5a0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a5b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a5c0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a5d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5f0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a600: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a620: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a630: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a640: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a650: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a660: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a670: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a680: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a690: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a6a0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a6b0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a6c0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a6d0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a6e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a6f0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a710: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a720: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a730: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a740: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a750: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a760: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a770: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a780: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a790: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a7a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a7b0: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a7c0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a7d0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a7e0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a7f0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a800: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a810: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a820: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a830: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a840: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a850: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a860: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a870: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a880: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a890: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a8a0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a8b0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a8c0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a8d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a8e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a8f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a900: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a910: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a920: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a930: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a940: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a950: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a960: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a970: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a980: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a9b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9c0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a9d0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a9e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a9f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
aa00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
aa10: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
aa20: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
aa30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
aa40: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
aa50: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
aa60: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
aa70: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
aa80: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
aa90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aaa0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
aab0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
aac0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aad0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
aae0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
aaf0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
ab00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
ab10: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
ab20: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
ab30: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
ab40: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
ab50: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
ab60: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
ab70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ab80: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
ab90: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
aba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
abb0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
abc0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
abd0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
abe0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
abf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ac00: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
ac10: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
ac20: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ac30: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
ac40: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
ac50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ac60: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
ac70: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
ac80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aca0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
acb0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
acc0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
acd0: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ace0: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
acf0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
ad00: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
ad10: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
ad20: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
ad30: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
ad40: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
ad50: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
ad60: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
ad70: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
ad80: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
ad90: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
ada0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
adb0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
adc0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
add0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
ade0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
adf0: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
ae00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ae10: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
ae20: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
ae30: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
ae40: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
ae50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ae60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
ae70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
ae80: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
ae90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
aea0: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
aeb0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
aec0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
aed0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
aee0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
aef0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
af00: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
af10: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
af20: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
af30: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
af40: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
af50: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
af60: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
af70: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
af80: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
af90: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
afa0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
afb0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
afc0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2a 0a 2a  ate(pPager).**.*
afd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
afe0: 61 73 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b  as external link
aff0: 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
b000: 73 75 70 70 72 65 73 73 20 63 6f 6d 70 69 6c 65  suppress compile
b010: 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a 20 61 62  r warnings.** ab
b020: 6f 75 74 20 61 6e 20 75 6e 75 73 65 64 20 66 75  out an unused fu
b030: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 65  nction.  It is e
b040: 6e 63 6c 6f 73 65 64 20 77 69 74 68 69 6e 20 53  nclosed within S
b050: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 6e 64 20  QLITE_DEBUG and 
b060: 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 61  so does.** not a
b070: 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
b080: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68 61 72 20  builds..*/.char 
b090: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
b0a0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
b0b0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
b0c0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
b0d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
b0e0: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
b0f0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
b100: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
b110: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
b120: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
b130: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
b140: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
b150: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
b160: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
b170: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
b180: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
b190: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
b1a0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
b1b0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
b1c0: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
b1d0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
b1e0: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
b1f0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
b200: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
b210: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
b220: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
b230: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
b240: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
b250: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
b260: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
b270: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
b280: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
b290: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
b2a0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
b2b0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
b2c0: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
b2d0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b2e0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
b2f0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
b300: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
b310: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b320: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
b330: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
b340: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
b350: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b360: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
b370: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
b380: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b390: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
b3a0: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
b3b0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
b3c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b3d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
b3e0: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
b3f0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
b400: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b410: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
b420: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
b430: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
b440: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
b450: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
b460: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
b470: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
b480: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
b490: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
b4a0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
b4b0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
b4c0: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
b4d0: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
b4e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
b4f0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
b500: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
b510: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
b520: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
b530: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
b540: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
b550: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b560: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b570: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
b580: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
b590: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b5a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b5b0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
b5c0: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
b5d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b5e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
b5f0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
b600: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b610: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b620: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b630: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b640: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b650: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b660: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b670: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b680: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b690: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b6a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b6b0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b6c0: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b6d0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b6e0: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b6f0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b700: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b710: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b720: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b730: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b740: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b750: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b760: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b770: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b780: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b790: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
b7a0: 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f  ces to the vario
b7b0: 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20  us page getters 
b7c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b7d0: 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65  tPageNormal(Page
b7e0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b7f0: 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  ,int);.static in
b800: 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50  t getPageError(P
b810: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b820: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51  e**,int);.#if SQ
b830: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b840: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
b850: 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65  getPageMMap(Page
b860: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b870: 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ,int);.#endif../
b880: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67  *.** Set the Pag
b890: 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66  er.xGet method f
b8a0: 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  or the appropria
b8b0: 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  te routine used 
b8c0: 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74  to fetch.** cont
b8d0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b8e0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b8f0: 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  id setGetterMeth
b900: 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  od(Pager *pPager
b910: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b920: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b930: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b940: 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66  etPageError;.#if
b950: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b960: 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20  _SIZE>0.  }else 
b970: 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
b980: 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49  ger).#ifdef SQLI
b990: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
b9a0: 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
b9b0: 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b  c==0.#endif.  ){
b9c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
b9d0: 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b  t = getPageMMap;
b9e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b9f0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
ba00: 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 */.  }else{.  
ba10: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
ba20: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a   getPageNormal;.
ba30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ba40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ba50: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ba60: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ba70: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ba80: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ba90: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
baa0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
bab0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
bac0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
bad0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
bae0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
baf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
bb00: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
bb10: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
bb20: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
bb30: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
bb40: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
bb50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
bb60: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bb70: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
bb80: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bb90: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
bba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
bbb0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
bbc0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
bbd0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
bbe0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
bbf0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
bc00: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
bc10: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
bc20: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
bc30: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
bc40: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
bc50: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
bc60: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
bc70: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
bc80: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
bc90: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
bca0: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
bcb0: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
bcc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
bcd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
bce0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
bcf0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
bd00: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
bd10: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
bd20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
bd30: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
bd40: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
bd50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bd60: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
bd70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
bd80: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
bd90: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
bda0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
bdb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
bdc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
bdd0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
bde0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
bdf0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
be00: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
be10: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
be20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
be30: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
be40: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
be50: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
be60: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
be70: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
be80: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
be90: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
bea0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
beb0: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
bec0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
bed0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
bee0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
bef0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
bf00: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
bf10: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
bf20: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
bf30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bf40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
bf50: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
bf60: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
bf70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf80: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bf90: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bfa0: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
bfb0: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
bfc0: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
bfd0: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
bfe0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
bff0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
c000: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
c010: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
c020: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
c030: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
c040: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c050: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
c060: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
c070: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
c080: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
c090: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
c0a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
c0b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
c0c0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
c0d0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
c0e0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
c0f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
c100: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
c110: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
c120: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
c130: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
c140: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c150: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c160: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
c170: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
c180: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
c190: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
c1a0: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
c1b0: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
c1c0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
c1d0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
c1e0: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
c1f0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
c200: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c210: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c220: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c230: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c240: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
c250: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
c260: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
c270: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
c280: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
c290: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c2a0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
c2b0: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
c2c0: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
c2d0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c2e0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c2f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c300: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
c310: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c320: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
c330: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
c340: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
c350: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
c360: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c370: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
c380: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
c390: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c3a0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
c3b0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c3c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c3d0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
c3e0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
c3f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c400: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c410: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
c420: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c430: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c440: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c450: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
c460: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
c470: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
c480: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c490: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
c4a0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c4b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
c4d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c4e0: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c4f0: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c500: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
c510: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
c520: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
c530: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
c540: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
c550: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
c560: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
c570: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
c580: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
c590: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
c5a0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
c5b0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
c5c0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
c5d0: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
c5e0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
c5f0: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
c600: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c610: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
c620: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
c630: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
c640: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
c650: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
c660: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
c670: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
c680: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
c690: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c6a0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c6b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c6c0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c6d0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
c6e0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
c6f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
c700: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
c710: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
c720: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
c730: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
c740: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
c750: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
c760: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
c770: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
c780: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
c790: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c7a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c7b0: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
c7c0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
c7d0: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
c7e0: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
c7f0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c800: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c810: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
c820: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
c830: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
c840: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c850: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
c860: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
c870: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
c880: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
c890: 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d  write or.** atom
c8a0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
c8c0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c8d0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a  is pager. The.**
c8e0: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
c8f0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c900: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c910: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c920: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c930: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c940: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
c950: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
c960: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
c970: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
c980: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c990: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c9a0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c9b0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c9c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c9d0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c9e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
c9f0: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
ca00: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
ca10: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
ca20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
ca30: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68  rnal .** file wh
ca40: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72  en it contains r
ca50: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
ca60: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
ca70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f  e..**.** The ato
ca80: 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20  mic-batch-write 
ca90: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
caa0: 20 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65   be used if OsDe
cab0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
cac0: 69 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  ics().** returns
cad0: 20 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68   a value with th
cae0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  e SQLITE_IOCAP_B
caf0: 41 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20  ATCH_ATOMIC bit 
cb00: 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65  set. -1 is.** re
cb10: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
cb20: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ase..**.** If ne
cb30: 69 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  ither optimizati
cb40: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
cb50: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
cb60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  /.static int jrn
cb70: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
cb80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
cb90: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
cba0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
cbb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cbc0: 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64  C_WRITE) \. || d
cbd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
cbe0: 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
cbf0: 43 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64  C_WRITE).  int d
cc00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cc20: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
cc30: 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
cc40: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
cc50: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20  er->fd) );.  dc 
cc60: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
cc70: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
cc80: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65  (pPager->fd);.#e
cc90: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
cca0: 41 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a  AMETER(pPager);.
ccb0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
ccc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
ccd0: 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  CH_ATOMIC_WRITE.
cce0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
ccf0: 53 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51  Size>0 && (dc&SQ
cd00: 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
cd10: 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20  _ATOMIC) ){.    
cd20: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23  return -1;.  }.#
cd30: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cd40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
cd50: 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20  IC_WRITE.  {.   
cd60: 20 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70   int nSector = p
cd70: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
cd80: 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
cd90: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
cda0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
cdb0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
cdc0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
cdd0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
cde0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
cdf0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
ce00: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
ce10: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
ce20: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
ce30: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
ce40: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
ce50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ce60: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
ce70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ce80: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
ce90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
cea0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
ceb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
cec0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
ced0: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
cee0: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
cef0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
cf00: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
cf10: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
cf20: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
cf30: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
cf40: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
cf50: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
cf60: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cf70: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
cf80: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
cf90: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
cfa0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
cfb0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
cfc0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
cfd0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
cfe0: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
cff0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
d000: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
d010: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
d020: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
d030: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
d040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
d050: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
d060: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
d070: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
d080: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
d090: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
d0a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
d0b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
d0c0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
d0d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
d0e0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
d0f0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
d100: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
d110: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
d120: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
d130: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
d140: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
d150: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
d160: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
d170: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
d180: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
d190: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
d1a0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
d1b0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
d1c0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
d1d0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
d1e0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
d1f0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
d200: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
d210: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
d220: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
d230: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
d240: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
d250: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
d260: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
d270: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
d280: 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
d290: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
d2a0: 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
d2b0: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
d2c0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
d2d0: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
d2e0: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
d2f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
d300: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
d310: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d320: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
d330: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73  .#define pager_s
d340: 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23  et_pagehash(X).#
d350: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
d360: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
d370: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
d380: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
d390: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
d3a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d3b0: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
d3c0: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
d3d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d3e0: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
d3f0: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
d400: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
d410: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
d420: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
d430: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
d440: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
d450: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
d460: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
d470: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
d480: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
d490: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
d4a0: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
d4b0: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
d4c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d4d0: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
d4e0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
d4f0: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
d500: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
d510: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
d520: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
d530: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
d540: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
d550: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
d560: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
d570: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
d580: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
d590: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
d5a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d5b0: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
d5c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d5d0: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
d5e0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
d5f0: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
d600: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
d610: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
d620: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
d630: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
d640: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
d650: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
d660: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
d670: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
d680: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d690: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d6a0: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
d6b0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
d6c0: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
d6d0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
d6e0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
d6f0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
d700: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
d710: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
d720: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
d730: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
d740: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
d750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
d770: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
d780: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d790: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d7a0: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
d7b0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
d7c0: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
d7d0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
d7e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d7f0: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
d800: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
d810: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
d820: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
d830: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
d840: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
d850: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
d860: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
d870: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
d880: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
d890: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8b0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d8c0: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d8e0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
d8f0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
d900: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
d910: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
d920: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
d930: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
d940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
d950: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
d960: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
d970: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
d980: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
d990: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
d9a0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
d9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
d9c0: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
d9d0: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
d9e0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
d9f0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
da00: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
da10: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
da20: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
da30: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
da40: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
da50: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
da60: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
da70: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
da80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
da90: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
daa0: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
dab0: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
dac0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31  .   || len>szJ-1
dad0: 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a  6.   || len==0 .
dae0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
daf0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
db00: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
db10: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
db20: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
db30: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
db40: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
db50: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
db60: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
db70: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
db80: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
db90: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
dba0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
dbb0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
dbc0: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
dbd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
dbe0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
dbf0: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
dc00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dc10: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
dc20: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
dc30: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
dc40: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
dc50: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
dc60: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
dc70: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
dc80: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
dc90: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
dca0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
dcb0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
dcc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
dcd0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
dce0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
dcf0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
dd00: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
dd10: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
dd20: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
dd30: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
dd40: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
dd50: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
dd60: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
dd70: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
dd80: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
dd90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dda0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
ddb0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
ddc0: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
ddd0: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
dde0: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
ddf0: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
de00: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
de10: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
de20: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
de30: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
de40: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
de50: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
de60: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
de70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
de80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
de90: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
dea0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
ded0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
def0: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
df10: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
df60: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
df70: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
df80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
df90: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
dfa0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
dfb0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
dfc0: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
dfd0: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
dfe0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
dff0: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
e000: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e010: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
e020: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
e030: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
e040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
e050: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
e060: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
e070: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e080: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
e090: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
e0a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e0b0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e0c0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
e0d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
e0e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e0f0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
e100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e110: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
e120: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
e130: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
e140: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
e150: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
e160: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
e170: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
e180: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
e190: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
e1a0: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
e1b0: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
e1c0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
e1d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e1e0: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
e1f0: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
e200: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
e210: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
e220: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e230: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
e240: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
e250: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
e260: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
e270: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
e280: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
e290: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
e2a0: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
e2b0: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
e2c0: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
e2d0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
e2e0: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
e2f0: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
e300: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
e310: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
e320: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
e330: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
e340: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e350: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
e360: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
e370: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
e380: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
e390: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
e3a0: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
e3b0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e3c0: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
e3d0: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
e3e0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
e3f0: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
e400: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
e410: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
e420: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
e430: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
e440: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
e450: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
e460: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
e470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
e480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
e490: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
e4a0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
e4b0: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
e4c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e500: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e510: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
e520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
e530: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
e540: 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
e550: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
e560: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e570: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
e580: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
e590: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
e5a0: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
e5b0: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
e5c0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
e5d0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
e5e0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
e5f0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
e600: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
e610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
e620: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
e630: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
e640: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
e650: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
e660: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
e670: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e680: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
e690: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
e6a0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
e6b0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
e6c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e6d0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
e6e0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
e6f0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
e700: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
e710: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
e720: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  |pPager->syncFla
e730: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
e740: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
e750: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e760: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
e770: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
e780: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
e790: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
e7a0: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
e7b0: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
e7c0: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
e7d0: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
e7e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
e7f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e800: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
e810: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
e820: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
e830: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
e840: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
e850: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
e860: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
e870: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
e880: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
e890: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
e8a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e8b0: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
e8c0: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
e8d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e8e0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
e8f0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
e900: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e910: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
e920: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
e930: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e940: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
e950: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
e960: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e970: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e980: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
e990: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e9a0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
e9b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
e9c0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
e9d0: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
e9e0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
e9f0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
ea00: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
ea10: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
ea20: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
ea30: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
ea40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
ea50: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
ea60: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
ea70: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
ea80: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
ea90: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
eaa0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
eab0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
eac0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
ead0: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
eae0: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
eaf0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
eb00: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
eb10: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
eb20: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
eb30: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
eb40: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
eb50: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
eb60: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
eb70: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
eb80: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
eb90: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
eba0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
ebb0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
ebc0: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
ebd0: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
ebe0: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
ebf0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
ec00: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
ec10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ec30: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ec40: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
ec50: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
ec60: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
ec70: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
ec80: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
ec90: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28   u32 nHeader = (
eca0: 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
ecb0: 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20  Size;/* Size of 
ecc0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
ecd0: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
ece0: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ed10: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
ed20: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
ed30: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ed60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
ed70: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
ed80: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
ed90: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
eda0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
edb0: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
edc0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
edd0: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
ede0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
edf0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
ee00: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ee10: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
ee20: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
ee30: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
ee40: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
ee50: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
ee60: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
ee70: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
ee80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
ee90: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
eea0: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
eeb0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
eec0: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
eed0: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
eee0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
eef0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
ef00: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
ef10: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
ef20: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
ef30: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
ef40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
ef50: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
ef60: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
ef70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ef80: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
ef90: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  fset(pPager);.. 
efa0: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
efb0: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
efc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
efd0: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
efe0: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
eff0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f000: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
f010: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
f020: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
f030: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
f040: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
f050: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
f060: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
f070: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
f080: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
f090: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
f0a0: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
f0b0: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
f0c0: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
f0d0: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
f0e0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
f0f0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
f100: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
f110: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
f120: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
f130: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
f140: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
f150: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
f160: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
f170: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
f180: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
f190: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f1a0: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
f1b0: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
f1c0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
f1d0: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
f1e0: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
f1f0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20  occurred whilst 
f200: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
f210: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
f220: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
f230: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
f240: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
f250: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
f260: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
f270: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
f280: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
f290: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
f2a0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
f2b0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
f2c0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
f2d0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
f2e0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
f2f0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
f300: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
f310: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
f320: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
f330: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f340: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
f350: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
f360: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
f370: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f380: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
f390: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f3a0: 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
f3b0: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28  >noSync );.  if(
f3c0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f3d0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
f3e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
f3f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
f400: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
f410: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
f420: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
f430: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
f440: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
f450: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
f460: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
f470: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
f480: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
f490: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
f4a0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f4b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
f4c0: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
f4d0: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
f4e0: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
f4f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f500: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
f510: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
f520: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65  -hash initialize
f530: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
f540: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
f550: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
f560: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
f570: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
f580: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f590: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f5a0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
f5b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f5c0: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
f5d0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
f5e0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f5f0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f600: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
f610: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
f620: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
f630: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
f640: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
f650: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
f660: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f670: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f680: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
f690: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
f6a0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
f6b0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f6c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f6d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
f6e0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f6f0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
f700: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
f710: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
f720: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
f730: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
f740: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
f750: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
f760: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
f770: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
f780: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
f790: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
f7a0: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
f7b0: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
f7c0: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
f7d0: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
f7e0: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
f7f0: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
f800: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f810: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
f820: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
f830: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
f840: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
f850: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
f860: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
f870: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
f880: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
f890: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
f8a0: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
f8b0: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
f8c0: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
f8d0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
f8e0: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
f8f0: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
f900: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
f910: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
f920: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
f930: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
f940: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
f950: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
f960: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
f970: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
f980: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
f990: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
f9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
f9b0: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
f9c0: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
f9d0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
f9e0: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
f9f0: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
fa00: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
fa10: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
fa20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fa30: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
fa40: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
fa50: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
fa60: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
fa70: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
fa80: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
fa90: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
faa0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
fab0: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
fac0: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
fad0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
fae0: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
faf0: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
fb00: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
fb10: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
fb20: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
fb30: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
fb40: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
fb50: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
fb60: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
fb70: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
fb80: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
fb90: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
fba0: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
fbb0: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
fbc0: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
fbd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fbe0: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
fbf0: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
fc00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
fc10: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
fc20: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
fc30: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
fc40: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
fc50: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
fc60: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
fc70: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
fc80: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
fc90: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
fca0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
fcb0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
fcc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
fcd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
fce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fcf0: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
fd00: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
fd10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fd20: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
fd30: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
fd40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
fd50: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
fd60: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
fd70: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
fd90: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
fda0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
fdb0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
fdc0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
fde0: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
fdf0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
fe00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
fe10: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
fe20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
fe30: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
fe40: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
fe50: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
fe60: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
fe70: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
fe80: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
fe90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
fea0: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
feb0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
fec0: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
fed0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
fee0: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
fef0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
ff00: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
ff10: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
ff20: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
ff30: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
ff40: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
ff50: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
ff60: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ff70: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
ff80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
ff90: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
ffa0: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
ffb0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
ffc0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
ffd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
ffe0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
fff0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
10000 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
10010 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
10020 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
10030 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
10040 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
10050 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
10060 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
10070 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
10090 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
100a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
100b0 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
100c0 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
100d0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
100e0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
100f0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
10100 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
10110 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
10120 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10130 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
10140 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
10150 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
10180 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
10190 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
101a0 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
101b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
101c0 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
101d0 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
101e0 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
101f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10210 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10220 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
10230 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
10240 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
10250 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
10260 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10270 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10280 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10290 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
102a0 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
102b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
102c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
102d0 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
102e0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
102f0 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
10300 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
10310 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
10320 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
10330 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
10340 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
10350 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
10360 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
10370 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
10380 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
10390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
103a0 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
103b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
103c0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
103d0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
103e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
103f0 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
10400 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
10410 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
10420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10430 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
10440 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10450 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
10460 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
10470 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
10480 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
10490 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
104a0 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
104b0 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
104c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
104d0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
104e0 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
104f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
10500 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
10510 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
10520 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
10530 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
10540 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
10550 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
10560 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
10570 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
10580 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
10590 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
105a0 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
105b0 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
105c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
105d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
105e0 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
105f0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
10600 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
10610 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
10640 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
10650 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
10660 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
10670 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10680 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
10690 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
106a0 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
106b0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
106c0 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
106d0 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
106e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
106f0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
10700 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
10710 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
10720 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10730 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10740 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10750 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
10760 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
10770 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
10780 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10790 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
107a0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
107b0 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
107c0 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
107d0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
107e0 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
107f0 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
10800 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10810 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
10820 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
10830 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10850 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
10860 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
10870 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
10880 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
10890 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
108a0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
108b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
108c0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
108d0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
108e0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72  sector-size jour
108f0 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64  nal header field
10900 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51  s. */.    if( SQ
10910 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10920 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10930 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10940 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29  0, &iSectorSize)
10950 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
10960 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10970 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10980 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26  d, iHdrOff+24, &
10990 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20  iPageSize)).    
109a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
109b0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
109c0 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  * Versions of SQ
109d0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
109e0 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65  5.8 set the page
109f0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
10a00 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
10a10 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f  l header to zero
10a20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
10a30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
10a40 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
10a50 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69     ** variable i
10a60 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
10a70 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
10a80 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
10a90 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61  ==0 ){.      iPa
10ab0 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
10ac0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10ad0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
10ae0 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
10af0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
10b00 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
10b10 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20  r-size fields.  
10b20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20    ** are within 
10b30 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e  range. To be 'in
10b40 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61   range', both va
10b50 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  lues need to be 
10b60 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f  a power.    ** o
10b70 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
10b80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35  an or equal to 5
10b90 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f  12 or 32, and no
10ba0 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  t greater than t
10bb0 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73  heir .    ** res
10bc0 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20  pective compile 
10bd0 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d  time maximum lim
10be0 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  its..    */.    
10bf0 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31  if( iPageSize<51
10c00 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
10c10 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a     || iSectorSiz
10c20 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61  e<32.     || iPa
10c30 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
10c40 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69  X_PAGE_SIZE || i
10c50 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  SectorSize>MAX_S
10c60 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20  ECTOR_SIZE.     
10c70 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  || ((iPageSize-1
10c80 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20  )&iPageSize)!=0 
10c90 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69    || ((iSectorSi
10ca0 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a  ze-1)&iSectorSiz
10cb0 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)!=0 .    ){.  
10cc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69      /* If the ei
10cd0 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69  ther the page-si
10ce0 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
10cf0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
10d00 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20  -header is .    
10d10 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68    ** invalid, th
10d20 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  en the process t
10d30 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f  hat wrote the jo
10d40 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73  urnal-header mus
10d50 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a  t have .      **
10d60 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20   crashed before 
10d70 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73  the header was s
10d80 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ynced. In this c
10d90 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ase stop reading
10da0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a   .      ** the j
10db0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
10dc0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10de0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
10df0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61  /* Update the pa
10e00 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  ge-size to match
10e10 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10e20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10e30 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20  . .    ** Use a 
10e40 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
10e50 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
10e60 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  at malloc failur
10e70 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  e within .    **
10e80 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
10e90 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20  e() is tested.. 
10ea0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
10eb0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
10ec0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
10ed0 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a  iPageSize, -1);.
10ee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
10ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  !=SQLITE_OK );..
10f00 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10f10 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
10f20 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10f30 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
10f40 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f   .    ** the pro
10f50 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
10f60 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
10f70 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
10f80 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  was.    ** creat
10f90 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
10fa0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
10fb0 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
10fc0 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73  outine.    ** is
10fd0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
10fe0 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
10ff0 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
11000 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20  local value.    
11010 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
11020 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
11030 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
11040 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
11050 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
11060 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
11070 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
11080 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11090 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
110a0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
110b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
110c0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
110d0 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
110e0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
110f0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
11100 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
11110 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
11120 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
11130 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
11140 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
11150 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
11160 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
11170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11180 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11190 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
111a0 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
111b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
111c0 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
111d0 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
111e0 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
111f0 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
11200 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
11210 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b  at is:.**.**   +
11220 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
11230 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20  MJ_PGNO..**   + 
11240 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  N bytes: Master 
11250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
11260 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20   in utf-8..**   
11270 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65  + 4 bytes: N (le
11280 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
11290 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62  ournal name in b
112a0 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72  ytes, no nul-ter
112b0 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b  minator)..**   +
112c0 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
112d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
112e0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38  ecksum..**   + 8
112f0 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
11300 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
11310 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11320 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
11330 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
11340 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
11350 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
11360 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63   name, where eac
11370 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
11380 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65  reted as a signe
11390 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e  d 8-bit integer.
113a0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
113b0 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
113c0 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
113d0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
113e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
113f0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
11400 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
11410 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
11420 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
11430 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
11440 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
11450 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11480 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
11490 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
114a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
114b0 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  h of string zMas
114c0 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  ter */.  i64 iHd
114d0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
114f0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e  set of header in
11500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
11510 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
11540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64  ournal file on d
11550 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  isk */.  u32 cks
11560 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  um = 0;         
11570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
11580 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20  cksum of string 
11590 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  zMaster */..  as
115a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
115b0 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
115c0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
115d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
115e0 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
115f0 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
11600 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
11610 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11620 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f  MORY .   || !isO
11630 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
11640 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
11650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11660 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
11670 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ter = 1;.  asser
11680 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
11690 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
116a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
116b0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
116c0 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
116d0 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
116e0 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
116f0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
11700 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
11710 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
11720 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
11730 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
11740 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
11750 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
11760 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
11770 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
11780 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
11790 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
117a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
117b0 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
117c0 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
117d0 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
117e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
117f0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
11800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
11810 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
11820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
11830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
11840 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
11850 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
11860 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
11870 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
11880 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
11890 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
118a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
118b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
118c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
118d0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
118e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
118f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
11900 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
11910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11930 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
11940 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
11950 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
11980 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
11990 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
119a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
119b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
119c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
119d0 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
119e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
119f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11a00 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11a10 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
11a20 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
11a30 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
11a40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
11a50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
11a60 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20  nalMagic, 8,.   
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48                iH
11a90 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11aa0 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  8))).  ){.    re
11ab0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
11ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11ad0 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30  f += (nMaster+20
11ae0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11af0 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
11b00 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
11b10 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
11b20 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
11b30 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
11b40 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
11b50 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
11b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
11b70 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
11b80 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
11b90 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
11ba0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
11bb0 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
11bc0 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
11bd0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
11be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
11bf0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
11c00 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
11c10 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
11c20 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
11c30 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
11c40 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
11c50 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
11c60 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
11c70 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
11c80 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
11c90 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
11ca0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
11cb0 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
11cc0 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
11cd0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
11ce0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
11cf0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
11d00 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20   &jrnlSize)).   
11d10 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67  && jrnlSize>pPag
11d20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
11d30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11d40 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
11d50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
11d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
11d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
11d90 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  rd the entire co
11da0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e  ntents of the in
11db0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63  -memory page-cac
11dc0 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  he..*/.static vo
11dd0 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
11de0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11df0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11e00 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74  rsion++;.  sqlit
11e10 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
11e20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
11e30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
11e40 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11e50 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11e60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61  * Return the pPa
11e70 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11e80 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73  n value.*/.u32 s
11e90 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56  qlite3PagerDataV
11ea0 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  ersion(Pager *pP
11eb0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
11ec0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11ed0 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  sion;.}../*.** F
11ee0 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11ef0 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11f00 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11f10 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11f20 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11f30 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11f40 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11f50 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11f60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11f70 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11f80 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11f90 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11fb0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11fc0 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11fd0 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
12000 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
12010 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
12020 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
12030 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
12040 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
12050 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
12060 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
12070 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
12080 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
12090 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
120a0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
120b0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
120c0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73  Memory(pPager->s
120d0 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
120e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
120f0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
12100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
12110 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
12120 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
12130 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
12140 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12150 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12160 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
12170 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
12180 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
12190 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
121a0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
121b0 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
121c0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
121d0 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
121e0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
121f0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
12200 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
12210 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
12220 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12230 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
12240 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
12250 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
12260 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12280 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12290 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
122a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
122b0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
122c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
122d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
122e0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
122f0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
12300 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
12310 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
12320 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
12330 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
12340 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
12350 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
12360 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
12370 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
12380 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12390 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
123a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
123b0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
123c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
123d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
123e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
123f0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
12400 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12410 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
12420 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
12430 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
12440 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
12450 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
12460 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
12470 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
12480 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
12490 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
124a0 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
124b0 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
124c0 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
124d0 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
124e0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
124f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12500 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
12510 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
12520 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
12530 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
12540 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
12550 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
12560 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
12570 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12580 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
12590 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
125a0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
125b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
125c0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
125d0 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
125e0 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
125f0 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
12600 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
12610 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
12620 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12630 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
12640 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
12650 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
12660 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
12670 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
12680 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
12690 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
126a0 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
126b0 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
126c0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
126d0 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
126e0 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
126f0 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
12700 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
12710 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
12720 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
12730 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
12740 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
12750 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
12760 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
12770 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
12780 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12790 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
127a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
127b0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
127c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
127d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
127e0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
127f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
12800 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
12810 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
12820 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
12830 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
12840 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
12850 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
12860 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
12870 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
12880 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12890 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
128a0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
128b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
128c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
128f0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
12900 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
12910 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
12920 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12930 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
12940 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12950 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
12960 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
12970 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
12980 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
12990 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
129a0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
129b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
129c0 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
129d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
129e0 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
129f0 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
12a00 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
12a10 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
12a20 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
12a30 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12a40 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12a50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12a60 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12a70 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
12a80 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12a90 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12aa0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
12ab0 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12ac0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12ad0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
12ae0 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
12af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12b00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12b10 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
12b20 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12b30 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12b40 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12b50 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
12b60 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12b70 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
12b80 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
12b90 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
12ba0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
12bb0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
12bc0 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
12bd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
12be0 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
12bf0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12c00 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
12c10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12c20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12c30 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12c40 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12c50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12c60 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12c70 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12c80 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12c90 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12ca0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12cb0 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
12cc0 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
12cd0 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
12ce0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
12cf0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
12d00 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
12d10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
12d20 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
12d30 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12d50 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12d60 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12d70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12d80 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12d90 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12da0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12db0 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
12dc0 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
12dd0 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
12de0 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
12df0 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
12e00 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
12e10 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
12e20 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
12e30 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12e40 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12e50 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12e60 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12e70 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12e80 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12e90 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12ea0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12eb0 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
12ec0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12ed0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
12ee0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12ef0 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
12f00 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
12f10 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
12f20 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12f30 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12f40 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12f50 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12f60 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12f70 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12f80 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12f90 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12fa0 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12fb0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
12fc0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
12fd0 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
12fe0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
12ff0 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
13000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13010 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
13020 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
13030 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13040 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
13050 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
13060 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
13070 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
13080 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
13090 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
130a0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  one = 0;.      p
130b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
130c0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
130d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
130e0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69  ger->eState = (i
130f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13100 64 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20  d) ? PAGER_OPEN 
13110 3a 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b  : PAGER_READER);
13120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55  .    }.    if( U
13130 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
13140 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
13150 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
13160 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
13170 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
13180 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65  TE_OK;.    setGe
13190 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
131a0 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  r);.  }..  pPage
131b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
131c0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
131d0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
131e0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
131f0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
13200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13210 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
13220 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
13230 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
13240 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
13250 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
13260 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
13270 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
13280 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
13290 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
132a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
132b0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
132c0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
132d0 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
132e0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
132f0 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
13300 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
13310 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
13320 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
13330 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
13340 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
13350 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
13360 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13370 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
13380 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
13390 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
133a0 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
133b0 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
133c0 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
133d0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
133e0 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
133f0 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
13400 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
13410 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
13420 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
13430 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
13440 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
13450 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
13460 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
13470 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
13480 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
13490 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
134a0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
134b0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
134c0 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
134d0 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
134e0 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
134f0 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
13500 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
13510 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
13520 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
13530 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
13540 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
13550 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
13560 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
13570 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
13580 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
13590 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
135a0 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
135b0 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
135c0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
135d0 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
135e0 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
135f0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
13600 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13610 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
13620 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
13630 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
13640 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
13650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
13660 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
13670 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
13680 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
13690 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
136a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
136b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
136c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
136d0 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
136e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
136f0 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
13700 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
13710 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
13720 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
13730 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
13740 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
13750 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20  PAGER_ERROR;.   
13760 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
13770 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
13780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
13790 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
137a0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
137b0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
137c0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  e);../*.** The w
137d0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
137e0 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20   open on pPager 
137f0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
13800 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a  ed (bCommit==1).
13810 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ** or rolled bac
13820 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a  k (bCommit==0)..
13830 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
13840 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  E if and only if
13850 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
13860 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68   should be flush
13870 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
13880 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  * Rules:.**.**  
13890 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50   *  For non-TEMP
138a0 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61   databases, alwa
138b0 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e  ys sync to disk.
138c0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
138d0 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20  ary.**      for 
138e0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20  transactions to 
138f0 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a  be durable..**.*
13900 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50  *   *  Sync TEMP
13910 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f   database only o
13920 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20  n a COMMIT (not 
13930 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e  a ROLLBACK) when
13940 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20   the backing.** 
13950 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65       file has be
13960 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61  en created alrea
13970 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20  dy (via a spill 
13980 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29  on pagerStress()
13990 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68  ) and.**      wh
139a0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
139b0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
139c0 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32  memory exceeds 2
139d0 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a  5% of the total.
139e0 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69  **      cache si
139f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
13a00 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f  t pagerFlushOnCo
13a10 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
13a20 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13a30 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
13a40 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65  tempFile==0 ) re
13a50 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62  turn 1;.  if( !b
13a60 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20  Commit ) return 
13a70 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  0;.  if( !isOpen
13a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
13a90 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
13aa0 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65  n (sqlite3PCache
13ab0 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61  PercentDirty(pPa
13ac0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32  ger->pPCache)>=2
13ad0 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  5);.}../*.** Thi
13ae0 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
13af0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
13b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
13b10 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
13b20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
13b30 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
13b40 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
13b50 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
13b60 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
13b70 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
13b80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
13b90 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
13ba0 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
13bb0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
13bc0 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
13bd0 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
13be0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
13bf0 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
13c00 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
13c10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13c20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
13c30 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
13c40 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63  tate. If it is c
13c50 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45  alled.** in PAGE
13c60 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f  R_NONE or PAGER_
13c70 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64  SHARED state and
13c80 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69   the lock held i
13c90 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73  s less.** exclus
13ca0 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52  ive than a RESER
13cb0 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  VED lock, it is 
13cc0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f  a no-op..**.** O
13cd0 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
13ce0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
13cf0 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
13d00 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
13d10 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
13d20 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
13d30 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
13d40 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
13d50 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
13d60 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
13d70 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
13d80 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
13d90 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
13da0 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
13db0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
13dc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
13dd0 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
13de0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
13df0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
13e00 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
13e10 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
13e20 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
13e30 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13e40 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
13e50 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13e60 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
13e70 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
13e80 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
13e90 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
13ea0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
13eb0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
13ec0 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
13ed0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
13ee0 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
13ef0 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
13f00 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
13f10 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
13f20 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
13f30 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
13f40 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
13f50 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
13f60 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
13f70 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
13f80 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13f90 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
13fa0 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
13fb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13fc0 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
13fd0 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
13fe0 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
13ff0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
14000 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
14010 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
14020 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
14030 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
14040 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
14050 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
14060 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
14070 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
14080 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
14090 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
140a0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
140b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
140c0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
140d0 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
140e0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
140f0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
14100 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
14110 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
14120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14130 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
14140 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
14150 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
14160 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
14170 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
14180 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
14190 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
141a0 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
141b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
141c0 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
141d0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
141e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
141f0 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74   is finalized, t
14200 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
14210 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
14220 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e  tate..** If runn
14230 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
14240 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  sive rollback mo
14250 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  de, the lock on 
14260 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  the file is .** 
14270 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
14280 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
14290 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
142a0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
142b0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
142c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
142d0 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
142e0 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
142f0 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
14300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14310 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
14320 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
14330 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14340 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
14350 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
14360 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
14370 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
14380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
14390 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
143a0 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
143b0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
143c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
143d0 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
143e0 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
143f0 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14400 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
14410 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
14420 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
14430 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
14440 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
14450 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
14460 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
14470 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
14480 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14490 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
144a0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
144b0 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
144c0 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ter, int bCommit
144d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
144e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
144f0 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14500 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
14510 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
14520 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  */.  int rc2 = S
14530 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
14540 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14550 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20   db file unlock 
14560 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
14570 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
14580 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
14590 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  not have an open
145a0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
145b0 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65  on.  ** or at le
145c0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
145d0 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ock. This functi
145e0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
145f0 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a   when there.  **
14600 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
14610 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20  nsaction active 
14620 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f  but a RESERVED o
14630 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
14640 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65  s.  ** held unde
14650 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  r two circumstan
14660 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ces:.  **.  **  
14670 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63   1. After a succ
14680 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e  essful hot-journ
14690 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
146a0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20  is called with. 
146b0 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d   **      eState=
146c0 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20  =PAGER_NONE and 
146d0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
146e0 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  _LOCK..  **.  **
146f0 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65     2. If a conne
14700 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69  ction with locki
14710 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14720 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
14730 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20  LUSIVE .  **    
14740 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20    lock switches 
14750 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f  back to locking_
14760 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20  mode=normal and 
14770 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a  then executes a.
14780 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74    **      read-t
14790 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
147a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
147b0 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d  led with eState=
147c0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
147d0 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f   **      and eLo
147e0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
147f0 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  CK when the read
14800 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
14810 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  closed..  */.  a
14820 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
14830 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
14840 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
14850 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14860 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
14870 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14880 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f  te<PAGER_WRITER_
14890 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72  LOCKED && pPager
148a0 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44  ->eLock<RESERVED
148b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
148c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
148d0 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   }..  releaseAll
148e0 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
148f0 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r);.  assert( is
14900 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
14910 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
14920 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20  Journal==0 .    
14930 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
14940 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
14950 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
14960 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
14970 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b  TCH_ATOMIC).  );
14980 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
14990 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
149a0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
149b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
149c0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
149d0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
149e0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
149f0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
14a00 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14a10 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  >jfd) ){.      /
14a20 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72  * assert( pPager
14a30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14a40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14a50 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20  _MEMORY ); */.  
14a60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14a70 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
14a80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14a90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14aa0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14ab0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
14ac0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
14ad0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14ae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
14af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14b20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14b30 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
14b40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14b50 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
14b60 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
14b70 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
14b80 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
14b90 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
14ba0 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
14bb0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
14bc0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
14bd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
14be0 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
14bf0 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
14c00 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
14c10 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
14c20 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
14c30 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
14c40 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
14c50 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
14c60 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
14c70 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
14c80 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
14c90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14ca0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14cb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14cc0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
14cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14ce0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14cf0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14d10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14d20 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14d30 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
14d40 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
14d50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
14d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14d70 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
14d80 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
14d90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
14da0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
14db0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c  ger, hasMaster||
14dc0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14dd0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14de0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14df0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14e00 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14e10 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
14e20 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
14e30 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
14e40 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
14e50 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
14e60 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
14e70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14e80 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14e90 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
14ea0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
14eb0 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
14ec0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
14ed0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
14ee0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
14ef0 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
14f00 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
14f10 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
14f20 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14f30 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65  te = !pPager->te
14f40 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73  mpFile;.      as
14f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75  sert( sqlite3Jou
14f60 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14f70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29  Pager->jfd)==0 )
14f80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14f90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14fa0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14fb0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14fc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14fd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14fe0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14ff0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
15000 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
15010 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
15020 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
15030 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
15040 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
15050 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
15060 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
15070 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
15080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
15090 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
150a0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
150b0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
150c0 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
150d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
150e0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
150f0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
15100 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
15110 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15120 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
15130 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
15140 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
15150 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
15160 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
15170 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
15180 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
15190 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
151a0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
151b0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
151c0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
151d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
151e0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
151f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15200 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
15210 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
15220 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
15230 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
15240 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
15250 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
15260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15270 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45  OK ){.    if( ME
15280 4d 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73  MDB || pagerFlus
15290 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  hOnCommit(pPager
152a0 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  , bCommit) ){.  
152b0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
152c0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
152d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
152e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
152f0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57  ite3PcacheClearW
15300 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e  ritable(pPager->
15310 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a  pPCache);.    }.
15320 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15330 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
15340 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
15350 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
15360 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
15370 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
15380 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
15390 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
153a0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
153b0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
153c0 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
153d0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
153e0 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
153f0 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
15400 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
15410 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
15420 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15430 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
15440 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
15450 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
15460 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
15470 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
15480 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
15490 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
154a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
154b0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
154c0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
154d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
154e0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
154f0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
15500 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
15510 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
15520 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
15530 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
15540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
15550 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
15560 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
15570 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
15580 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
15590 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
155a0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
155b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
155c0 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
155d0 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
155e0 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
155f0 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
15600 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
15610 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
15620 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
15630 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
15640 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
15650 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
15660 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
15670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15680 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
15690 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
156a0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
156b0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
156c0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
156d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
156e0 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
156f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15700 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
15710 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
15720 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49  LITE_FCNTL_COMMI
15730 54 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a  T_PHASETWO, 0);.
15740 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15750 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
15760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15770 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
15780 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15790 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
157a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
157b0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
157c0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
157d0 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
157e0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
157f0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
15800 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15810 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
15820 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
15830 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
15840 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
15850 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
15860 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
15870 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
15880 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
15890 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
158a0 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
158b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
158c0 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
158d0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
158e0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
158f0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
15900 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15910 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
15920 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
15930 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
15940 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
15950 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
15960 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
15970 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
15980 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
15990 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
159a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
159b0 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
159c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
159d0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
159e0 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
159f0 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
15a00 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
15a10 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15a20 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
15a30 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
15a40 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
15a50 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
15a60 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
15a70 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
15a80 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
15a90 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
15aa0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15ab0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
15ac0 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
15ad0 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15ae0 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
15af0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15b00 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
15b10 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
15b20 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
15b30 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
15b40 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
15b50 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
15b60 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
15b70 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
15b80 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15b90 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
15ba0 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
15bb0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
15bc0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15be0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
15bf0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
15c00 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
15c10 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
15c20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
15c30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
15c40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
15c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
15c60 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15c70 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
15c80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15c90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15ca0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15cb0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
15cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15cd0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15ce0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15cf0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
15d00 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
15d10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15d20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
15d30 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
15d40 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
15d50 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
15d60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15d70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
15d80 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
15d90 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
15da0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
15db0 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
15dc0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
15dd0 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
15de0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
15df0 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
15e00 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
15e10 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
15e20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
15e30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
15e40 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15e50 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
15e60 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
15e70 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
15e80 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
15e90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
15ea0 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
15eb0 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
15ec0 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
15ed0 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
15ee0 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
15ef0 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
15f00 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
15f10 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
15f20 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
15f30 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
15f40 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
15f50 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
15f60 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
15f70 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
15f80 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
15f90 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
15fa0 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
15fb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
15fc0 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
15fd0 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
15fe0 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
15ff0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
16000 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
16010 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
16020 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
16030 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
16040 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
16050 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
16060 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
16070 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
16080 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
16090 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
160a0 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
160b0 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
160c0 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
160d0 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
160e0 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
160f0 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
16100 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
16110 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
16120 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
16130 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
16140 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
16150 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
16160 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
16170 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
16180 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
16190 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
161a0 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
161b0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
161c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
161d0 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
161e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
161f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
16200 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
16210 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
16220 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
16230 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
16240 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
16250 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
16260 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
16270 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
16280 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
16290 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
162a0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
162b0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
162c0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
162d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
162e0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
162f0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
16300 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
16310 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
16320 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
16330 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
16360 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
16370 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
16380 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16390 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
163a0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
163b0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
163c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
163d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
163e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
163f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16400 65 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20  eserved bits is 
16410 74 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20  the same in the 
16420 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70  destination.** p
16430 61 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e  ager as it is in
16440 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68   the source.  Th
16450 69 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e  is comes up when
16460 20 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65   a VACUUM change
16470 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
16480 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16490 20 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c   to the "optimal
164a0 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  " amount..*/.voi
164b0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c  d sqlite3PagerAl
164c0 69 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72  ignReserve(Pager
164d0 20 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a   *pDest, Pager *
164e0 70 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65  pSrc){.  if( pDe
164f0 73 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53  st->nReserve!=pS
16500 72 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a  rc->nReserve ){.
16510 20 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65      pDest->nRese
16520 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73  rve = pSrc->nRes
16530 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
16540 65 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29  eportSize(pDest)
16550 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
16560 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
16570 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
16580 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
16590 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
165a0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
165b0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
165c0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
165d0 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
165e0 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
165f0 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
16600 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
16610 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
16620 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
16630 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
16640 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
16650 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
16660 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
16670 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
16680 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
16690 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
166a0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
166b0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
166c0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
166d0 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
166e0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
166f0 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
16700 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16710 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
16720 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
16730 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
16740 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
16750 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
16760 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
16770 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16780 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
16790 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
167a0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
167b0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
167c0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
167d0 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
167e0 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
167f0 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
16800 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16810 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
16820 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
16830 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
16840 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
16850 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
16860 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
16870 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
16880 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
16890 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
168a0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
168b0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
168c0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
168d0 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
168e0 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
168f0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16900 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
16910 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
16920 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16930 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
16940 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
16950 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
16960 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
16970 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16980 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
16990 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
169a0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
169b0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
169c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
169d0 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
169e0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
169f0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16a00 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
16a10 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
16a20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
16a30 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
16a40 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
16a50 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
16a60 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
16a70 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
16a80 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16a90 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
16aa0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
16ab0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
16ac0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
16ad0 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
16ae0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
16af0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
16b00 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
16b10 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
16b20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
16b30 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
16b40 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
16b50 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
16b60 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
16b70 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
16b80 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
16b90 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
16ba0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
16bb0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
16bc0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
16bd0 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
16be0 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
16bf0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16c00 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
16c10 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
16c20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
16c30 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
16c40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
16c50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16c60 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
16c70 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
16c80 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16c90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16ca0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
16cb0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
16cc0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
16cd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16ce0 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
16cf0 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
16d00 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
16d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
16d20 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
16d30 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
16d40 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
16d50 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
16d60 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
16d70 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
16d80 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
16d90 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
16dc0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16dd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16de0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
16e10 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
16e20 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
16e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16e50 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
16e60 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
16e70 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
16ea0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
16eb0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
16ec0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
16ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
16ee0 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
16ef0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
16f00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
16f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
16f30 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
16f40 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
16f50 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
16f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16f70 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
16f80 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
16f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16fa0 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68  AS_CODEC.  /* Th
16fb0 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69  e jrnlEnc flag i
16fc0 73 20 74 72 75 65 20 69 66 20 4a 6f 75 72 6e 61  s true if Journa
16fd0 6c 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  l pages should b
16fe0 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
16ff0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e  .  ** the codec.
17000 20 20 49 74 20 69 73 20 66 61 6c 73 65 20 66 6f    It is false fo
17010 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79  r pure in-memory
17020 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
17030 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e  const int jrnlEn
17040 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20  c = (isMainJrnl 
17050 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
17060 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e  nMemory==0);.#en
17070 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 28  dif..  assert( (
17080 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
17090 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
170a0 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
170b0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
170c0 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
170d0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
170e0 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
170f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
17100 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
17110 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
17120 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
17130 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
17140 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
17150 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
17160 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
17170 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
17180 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
17190 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
171a0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
171b0 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
171c0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
171d0 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
171e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
171f0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
17200 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
17210 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
17220 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
17230 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
17240 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
17250 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
17260 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
17270 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
17280 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
17290 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
172a0 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
172b0 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
172c0 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
172d0 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
172e0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
172f0 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
17300 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
17310 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
17320 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
17330 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
17340 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
17350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17360 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
17370 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
17380 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
17390 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
173a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
173b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
173c0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
173d0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
173e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
173f0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
17400 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
17410 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
17420 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17430 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17440 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17450 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
17460 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
17470 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
17480 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
17490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
174a0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
174b0 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
174c0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
174d0 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
174e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
174f0 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
17500 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
17510 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
17520 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
17530 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
17540 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
17550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17560 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17580 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
17590 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
175a0 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
175b0 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
175c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
175d0 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
175e0 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
175f0 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
17600 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
17610 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
17620 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
17630 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
17640 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
17650 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
17660 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
17670 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
17680 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
17690 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
176a0 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
176b0 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
176c0 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
176d0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
176e0 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
176f0 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
17700 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
17710 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
17720 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
17730 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
17740 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
17750 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
17760 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
17770 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
17780 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
17790 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
177a0 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
177b0 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
177c0 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
177d0 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
177e0 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
177f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17800 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
17810 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
17820 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
17830 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
17840 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
17850 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
17860 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
17870 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
17880 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
17890 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
178a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
178b0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
178c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
178d0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
178e0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
178f0 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
17900 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
17910 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
17920 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
17930 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
17940 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
17950 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
17960 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
17970 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
17980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17990 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
179a0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
179b0 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
179c0 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
179d0 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
179e0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
179f0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17a00 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
17a10 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
17a20 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
17a30 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
17a40 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
17a50 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
17a60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
17a70 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
17a80 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
17a90 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
17aa0 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
17ab0 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
17ac0 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
17ad0 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
17ae0 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
17af0 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
17b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
17b10 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
17b20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
17b30 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
17b40 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
17b50 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
17b60 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
17b70 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
17b80 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
17b90 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
17ba0 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
17bb0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
17bc0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
17bd0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
17be0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17bf0 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
17c00 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
17c10 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
17c20 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
17c30 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
17c40 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
17c50 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
17c60 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
17c70 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
17c80 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
17c90 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
17ca0 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
17cb0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
17cc0 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
17cd0 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
17ce0 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
17cf0 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
17d00 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
17d10 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
17d20 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
17d30 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
17d40 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
17d50 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
17d60 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
17d70 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
17d80 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
17d90 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
17da0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17db0 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
17dc0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
17dd0 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
17de0 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
17df0 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
17e00 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
17e10 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
17e20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
17e30 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
17e40 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
17e50 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
17e60 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
17e70 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
17e80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17e90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
17ea0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
17eb0 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
17ec0 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
17ed0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
17ee0 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
17ef0 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
17f00 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
17f10 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
17f20 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
17f30 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
17f40 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
17f50 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
17f60 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
17f70 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
17f80 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
17f90 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17fa0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
17fb0 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
17fc0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
17fd0 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
17fe0 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
17ff0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
18000 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
18010 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
18020 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
18030 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
18040 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
18050 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
18060 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
18070 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
18080 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
18090 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
180a0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
180b0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
180c0 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
180d0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
180e0 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
180f0 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
18100 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
18110 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
18120 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
18130 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
18140 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
18150 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
18160 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
18170 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
18180 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
18190 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
181a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
181b0 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
181c0 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
181d0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
181e0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
181f0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
18200 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
18210 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
18220 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
18230 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
18240 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
18250 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
18260 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
18270 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
18280 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
18290 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
182a0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
182b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
182c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
182d0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
182e0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
182f0 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
18300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18310 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
18320 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
18330 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18340 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52 54  File );.  PAGERT
18350 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
18360 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
18370 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
18380 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
18390 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
183a0 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
183b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
183c0 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
183d0 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
183e0 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
183f0 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
18400 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
18410 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
18420 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
18430 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
18440 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
18450 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
18460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
18470 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
18480 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
18490 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
184a0 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
184b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
184c0 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
184d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
184e0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
184f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
18500 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
18510 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
18520 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
18530 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
18540 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
18550 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
18560 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
18570 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
18580 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
18590 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
185a0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
185b0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
185c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61   /* Write the da
185d0 74 61 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ta read from the
185e0 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e   journal back in
185f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18600 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69  file..    ** Thi
18610 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66  s is usually saf
18620 65 20 65 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e  e even for an en
18630 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
18640 20 2d 20 61 73 20 74 68 65 20 64 61 74 61 0a 20   - as the data. 
18650 20 20 20 2a 2a 20 77 61 73 20 65 6e 63 72 79 70     ** was encryp
18660 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 77 61  ted before it wa
18670 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
18680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18690 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
186a0 20 2a 2a 20 69 73 20 69 66 20 74 68 65 20 64 61   ** is if the da
186b0 74 61 20 77 61 73 20 6a 75 73 74 20 72 65 61 64  ta was just read
186c0 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f   from an in-memo
186d0 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ry sub-journal. 
186e0 49 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  In that.    ** c
186f0 61 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 65  ase it must be e
18700 6e 63 72 79 70 74 65 64 20 68 65 72 65 20 62 65  ncrypted here be
18710 66 6f 72 65 20 69 74 20 69 73 20 63 6f 70 69 65  fore it is copie
18720 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  d into the datab
18730 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
18740 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18750 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
18760 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b   if( !jrnlEnc ){
18770 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
18780 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18790 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
187a0 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
187b0 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
187c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
187d0 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
187e0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
187f0 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
18800 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18810 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18820 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18830 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
18840 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
18850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18860 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18870 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
18880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18890 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  ofst);..    if( 
188a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
188b0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
188c0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
188d0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
188e0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
188f0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 23 69 66  ->pBackup ){.#if
18900 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
18910 4f 44 45 43 0a 20 20 20 20 20 20 69 66 28 20 6a  ODEC.      if( j
18920 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  rnlEnc ){.      
18930 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
18940 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
18950 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18960 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 20 20  _BKPT);.        
18970 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
18980 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18990 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
189a0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
189b0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
189c0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
189d0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
189e0 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20 20 20 20  KPT,aData);.    
189f0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
18a00 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18a10 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18a20 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
18a30 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
18a40 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
18a50 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
18a60 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
18a70 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
18a80 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
18a90 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
18aa0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
18ab0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
18ac0 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
18ad0 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
18ae0 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
18af0 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
18b00 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
18b10 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
18b20 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
18b30 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
18b40 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
18b50 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
18b60 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
18b70 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
18b80 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
18b90 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
18ba0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
18bb0 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
18bc0 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
18bd0 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
18be0 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
18bf0 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
18c00 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
18c10 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
18c20 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
18c30 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
18c40 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
18c50 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
18c60 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
18c70 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
18c80 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
18c90 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
18ca0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18cb0 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
18cc0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
18cd0 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
18ce0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
18cf0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
18d00 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
18d10 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
18d20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
18d30 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
18d40 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
18d50 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
18d60 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
18d70 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
18d80 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
18d90 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
18da0 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
18db0 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
18dc0 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
18dd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
18de0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
18df0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
18e00 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
18e10 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18e20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
18e30 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
18e40 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
18e50 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
18e60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18e70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
18e80 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
18e90 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
18ea0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
18eb0 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
18ec0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18ed0 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
18ee0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18f00 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18f10 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
18f20 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
18f30 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
18f40 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
18f50 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
18f60 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
18f70 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
18f80 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
18f90 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
18fa0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
18fb0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
18fc0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
18fd0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
18fe0 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
18ff0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
19000 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
19010 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
19020 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
19030 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
19040 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
19050 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
19060 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
19070 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19080 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
19090 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
190a0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
190b0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
190c0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
190d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
190e0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
190f0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
19100 20 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74      /* It used t
19110 6f 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65  o be that sqlite
19120 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
19130 28 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64  (pPg) was called
19140 20 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20   here.  But.    
19150 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73  ** that call was
19160 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68   dangerous and h
19170 61 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65  ad no detectable
19180 20 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74   benefit since t
19190 68 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20  he cache.    ** 
191a0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61  is normally clea
191b0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
191c0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61  acheCleanAll() a
191d0 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  fter rollback an
191e0 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20  d so.    ** has 
191f0 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  been removed. */
19200 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
19210 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
19220 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
19230 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
19240 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
19250 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
19260 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
19270 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
19280 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
19290 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
192a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
192b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
192c0 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
192d0 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
192e0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
192f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
19300 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
19310 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
19320 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  sk */.#if SQLITE
19330 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
19340 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f  f( jrnlEnc ){ CO
19350 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
19360 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
19370 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
19380 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69  M_BKPT); }.#endi
19390 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  f.    sqlite3Pca
193a0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
193b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
193c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
193d0 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
193e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
193f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19400 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
19410 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
19420 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
19430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19440 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
19450 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
19460 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19470 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
19480 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
19490 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
194a0 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
194b0 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
194c0 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
194d0 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
194e0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
194f0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
19500 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
19510 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
19520 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
19530 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
19540 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
19550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19560 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
19570 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
19580 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
19590 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
195a0 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
195b0 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
195c0 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
195d0 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
195e0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
195f0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
19600 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
19610 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
19620 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
19630 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
19640 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
19650 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19660 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
19670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
19680 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
19690 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
196a0 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
196b0 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
196c0 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
196d0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
196e0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
196f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
19700 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
19710 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
19720 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
19730 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
19740 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
19750 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
19760 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
19770 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
19780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19790 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
197a0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
197b0 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
197c0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
197d0 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
197e0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
197f0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
19800 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
19810 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
19820 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
19830 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
19840 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
19850 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
19860 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
19870 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
19880 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
19890 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
198a0 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
198b0 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
198c0 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
198d0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
198e0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
198f0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
19900 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
19910 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
19920 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
19930 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
19940 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
19950 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
19960 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
19970 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
19980 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
19990 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
199a0 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
199b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
199c0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
199d0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
199e0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
199f0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
19a00 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
19a10 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
19a20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
19a30 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19a40 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
19a50 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
19a60 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
19a70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
19a80 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
19a90 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19aa0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
19ab0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
19ac0 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
19ad0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19ae0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19af0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
19b00 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
19b10 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
19b20 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
19b30 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
19b40 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
19b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19b60 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
19b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
19b80 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
19b90 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
19ba0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
19bb0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
19bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19bd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19be0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
19bf0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
19c00 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
19c10 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
19c20 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
19c30 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
19c40 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
19c50 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
19c60 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
19c70 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
19c80 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
19c90 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
19ca0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
19cb0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
19cc0 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
19cd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19ce0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
19cf0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
19d00 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
19d10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19d20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
19d30 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
19d40 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
19d50 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
19d60 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
19d70 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
19d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19d90 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
19da0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
19db0 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
19dc0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
19dd0 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
19de0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
19df0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
19e00 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
19e10 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
19e20 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
19e30 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
19e40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19e50 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
19e60 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
19e70 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
19e80 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
19e90 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
19ea0 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
19eb0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
19ec0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
19ed0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
19ee0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
19ef0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
19f00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19f10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  OMEM_BKPT;.  }el
19f20 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
19f30 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
19f40 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19f50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
19f60 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
19f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19f80 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
19f90 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
19fa0 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
19fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19fc0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19fd0 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
19fe0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
19ff0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1a000 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
1a010 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
1a020 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
1a030 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
1a040 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
1a050 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
1a060 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
1a070 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
1a080 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
1a090 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
1a0a0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1a0b0 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
1a0c0 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
1a0d0 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
1a0e0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1a0f0 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
1a100 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
1a110 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
1a120 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a130 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a140 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
1a150 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1a160 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
1a170 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
1a180 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
1a190 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
1a1a0 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
1a1b0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a1c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a1d0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
1a1e0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a1f0 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
1a200 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
1a210 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
1a220 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
1a230 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
1a240 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
1a250 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
1a260 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
1a270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a280 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a290 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
1a2a0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a2b0 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
1a2c0 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
1a2d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
1a2e0 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
1a2f0 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
1a300 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
1a310 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
1a320 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
1a330 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a340 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
1a350 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1a360 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
1a370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a380 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1a390 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a3a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
1a3b0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
1a3c0 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
1a3d0 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
1a3e0 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
1a3f0 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
1a400 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
1a410 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
1a420 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
1a430 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
1a440 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
1a450 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
1a460 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
1a470 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
1a480 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1a490 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
1a4a0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1a4b0 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
1a4c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1a4d0 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
1a4e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a4f0 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
1a500 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
1a510 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a530 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a540 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a550 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
1a560 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1a570 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
1a580 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
1a590 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
1a5a0 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
1a5b0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
1a5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a5d0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a5e0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a5f0 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
1a600 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
1a610 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
1a620 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
1a630 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
1a640 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
1a650 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
1a660 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
1a670 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a680 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
1a690 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a6a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1a6b0 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
1a6c0 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
1a6d0 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
1a6e0 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
1a6f0 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
1a700 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a710 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
1a720 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
1a730 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
1a740 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
1a750 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
1a760 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
1a770 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1a780 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
1a790 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
1a7a0 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
1a7b0 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
1a7c0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1a7d0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1a7e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a7f0 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
1a800 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
1a810 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a820 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
1a830 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
1a840 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
1a850 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
1a860 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
1a870 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
1a880 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
1a890 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
1a8a0 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
1a8b0 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
1a8c0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1a8d0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
1a8e0 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72  en, or the pager
1a8f0 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65   is not in eithe
1a900 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50  r.** DBMOD or OP
1a910 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  EN state, this f
1a920 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1a930 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1a940 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74  he size .** of t
1a950 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67  he file is chang
1a960 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
1a970 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
1a980 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
1a990 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  . .** If the fil
1a9a0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  e on disk is cur
1a9b0 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
1a9c0 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
1a9d0 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
1a9e0 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
1a9f0 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
1aa00 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
1aa10 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
1aa20 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
1aa30 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
1aa40 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
1aa50 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
1aa60 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1aa70 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
1aa80 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
1aa90 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
1aaa0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
1aab0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
1aac0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
1aad0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
1aae0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
1aaf0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
1ab00 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
1ab10 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
1ab20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
1ab30 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
1ab40 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
1ab50 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1ab60 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1ab70 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1ab80 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
1ab90 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
1aba0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
1abb0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
1abc0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1abd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1abe0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
1abf0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
1ac00 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1ac10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1ac20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1ac30 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
1ac40 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
1ac50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1ac60 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
1ac70 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
1ac80 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
1ac90 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1aca0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1acb0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1acc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1acd0 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
1ace0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
1acf0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
1ad00 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
1ad10 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1ad20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ad30 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1ad40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
1ad50 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
1ad60 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
1ad70 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
1ad80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1ad90 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1ada0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
1adb0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
1adc0 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
1add0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
1ade0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1adf0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
1ae00 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1ae10 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
1ae20 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1ae30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ae40 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1ae50 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
1ae60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ae70 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
1ae80 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
1ae90 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1aea0 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
1aeb0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
1aec0 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
1aed0 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
1aee0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1aef0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
1af00 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1af10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1af20 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1af30 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
1af40 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1af50 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1af60 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
1af70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
1af80 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
1af90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1afa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1afb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1afc0 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1afd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1afe0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1aff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b000 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
1b010 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
1b020 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
1b030 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
1b040 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1b050 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
1b060 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
1b070 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
1b080 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
1b090 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
1b0a0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
1b0b0 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
1b0c0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1b0d0 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
1b0e0 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
1b0f0 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
1b100 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
1b110 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
1b120 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
1b130 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
1b140 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
1b150 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
1b160 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1b170 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
1b180 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1b190 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1b1a0 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
1b1b0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
1b1c0 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
1b1d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b1e0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b1f0 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
1b200 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1b210 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
1b220 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
1b230 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
1b240 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
1b250 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
1b260 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
1b270 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
1b280 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
1b290 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
1b2a0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
1b2b0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
1b2c0 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
1b2d0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1b2e0 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
1b2f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
1b300 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
1b310 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
1b320 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b330 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
1b340 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b350 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b360 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
1b370 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
1b380 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
1b390 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
1b3a0 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
1b3b0 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
1b3c0 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1b3d0 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
1b3e0 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
1b3f0 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
1b400 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1b410 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b420 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
1b430 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
1b440 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b450 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
1b460 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
1b470 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
1b480 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b490 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
1b4a0 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
1b4b0 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
1b4c0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1b4d0 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
1b4e0 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
1b4f0 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
1b500 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
1b510 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
1b520 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b530 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
1b540 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
1b550 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
1b560 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b570 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
1b580 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
1b590 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
1b5a0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1b5b0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
1b5c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1b5d0 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
1b5e0 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
1b5f0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b600 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
1b610 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
1b620 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
1b630 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1b640 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1b650 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1b660 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1b670 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1b680 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1b690 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1b6a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1b6b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1b6c0 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1b6d0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1b6e0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b6f0 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1b700 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1b710 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1b720 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b730 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1b740 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1b750 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1b760 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1b770 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1b780 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1b790 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1b7a0 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1b7b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1b7c0 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1b7d0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1b7e0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1b7f0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1b800 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1b810 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1b820 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1b830 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1b840 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1b850 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1b860 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1b870 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1b880 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1b890 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1b8a0 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1b8b0 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1b8c0 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1b8d0 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1b8e0 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1b8f0 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1b900 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b910 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1b920 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1b930 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1b940 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1b950 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1b960 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1b970 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1b980 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1b990 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1b9a0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1b9b0 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1b9c0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b9d0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b9e0 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1b9f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1ba00 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1ba10 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1ba20 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1ba30 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1ba40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1ba50 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1ba60 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1ba70 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1ba80 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1ba90 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1baa0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1bab0 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1bac0 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1bad0 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1bae0 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1baf0 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1bb00 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1bb10 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1bb20 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1bb30 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1bb40 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1bb50 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1bb60 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1bb70 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1bb80 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1bb90 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1bba0 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1bbb0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1bbc0 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1bbd0 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1bbe0 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1bbf0 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1bc00 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1bc10 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1bc20 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1bc30 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1bc40 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1bc50 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1bc60 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1bc70 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1bc80 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1bc90 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1bca0 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1bcb0 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1bcc0 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1bcd0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1bce0 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1bcf0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1bd00 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1bd10 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1bd20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1bd30 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1bd40 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bd50 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1bd60 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1bd70 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1bd80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1bd90 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1bda0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1bdb0 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1bdc0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1bdd0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1bde0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1bdf0 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1be00 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1be10 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1be20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1be30 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1be40 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1be50 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1be60 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1be70 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1be80 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1be90 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1bea0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1beb0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1bec0 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1bed0 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1bee0 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1bef0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1bf00 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1bf10 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1bf20 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1bf30 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1bf40 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1bf50 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1bf60 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1bf70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1bf80 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1bf90 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1bfa0 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1bfb0 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1bfc0 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1bfd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1bfe0 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1bff0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1c000 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1c010 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1c020 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1c030 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1c040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c050 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1c060 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1c070 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1c080 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1c090 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1c0a0 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1c0b0 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1c0c0 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1c0d0 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1c0e0 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1c0f0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1c100 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1c110 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1c120 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1c130 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1c140 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1c150 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1c160 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1c170 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1c180 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1c190 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1c1a0 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1c1b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1c1c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1c1d0 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1c1e0 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1c1f0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1c200 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1c210 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1c220 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1c230 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1c240 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1c250 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1c260 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1c270 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1c280 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1c290 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1c2a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1c2b0 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1c2c0 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1c2d0 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1c2e0 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1c2f0 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1c300 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1c310 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1c320 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1c330 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c340 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c350 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c360 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1c370 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1c380 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1c390 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1c3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c3b0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1c3c0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1c3d0 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3f0 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1c400 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1c410 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c430 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1c440 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1c450 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1c460 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c470 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1c480 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1c490 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1c4b0 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1c4c0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1c4d0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1c4e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c4f0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1c500 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1c510 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1c520 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1c530 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1c540 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1c550 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1c560 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1c570 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1c580 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1c590 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1c5a0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61  ck */.  int nPla
1c5b0 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  yback = 0;      
1c5c0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c5d0 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72   of pages restor
1c5e0 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ed from journal 
1c5f0 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 50 61  */.  u32 savedPa
1c600 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
1c610 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >pageSize;..  /*
1c620 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1c630 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
1c640 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1c650 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
1c660 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
1c670 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
1c680 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1c690 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1c6a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c6b0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1c6c0 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
1c6d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c6e0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
1c6f0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1c700 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1c710 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
1c720 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
1c730 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
1c740 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
1c750 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1c760 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
1c770 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
1c780 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
1c790 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
1c7a0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
1c7b0 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
1c7c0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
1c7d0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
1c7e0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
1c7f0 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
1c800 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
1c810 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
1c820 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
1c830 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
1c840 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
1c850 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
1c860 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
1c870 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
1c880 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
1c890 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
1c8a0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1c8b0 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
1c8c0 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50  unix.c,.  ** mxP
1c8d0 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
1c8e0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
1c8f0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
1c900 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
1c910 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
1c920 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
1c930 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1c940 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
1c950 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1c960 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1c970 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1c980 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c990 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
1c9a0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1c9b0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
1c9c0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1c9d0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
1c9e0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1c9f0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
1ca00 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
1ca10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ca20 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
1ca30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1ca40 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
1ca50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1ca60 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
1ca70 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
1ca80 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
1ca90 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
1caa0 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
1cab0 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
1cac0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1cad0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
1cae0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1caf0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
1cb00 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
1cb10 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
1cb20 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
1cb30 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
1cb40 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
1cb50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1cb60 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
1cb70 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
1cb80 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
1cb90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cba0 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
1cbb0 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
1cbc0 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
1cbd0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
1cbe0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1cbf0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
1cc00 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
1cc10 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
1cc20 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
1cc30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
1cc40 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1cc50 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1cc60 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
1cc70 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
1cc80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1cc90 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1cca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ccb0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1ccc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ccd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1cce0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1ccf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cd00 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
1cd10 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
1cd20 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
1cd30 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1cd40 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
1cd50 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1cd60 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1cd70 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
1cd80 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
1cd90 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
1cda0 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
1cdb0 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
1cdc0 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
1cdd0 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
1cde0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
1cdf0 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
1ce00 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1ce10 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
1ce20 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
1ce30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ce40 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1ce50 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1ce60 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
1ce70 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1ce80 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1ce90 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
1cea0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1ceb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1cec0 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
1ced0 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
1cee0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1cef0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1cf00 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1cf10 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
1cf20 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
1cf30 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
1cf40 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
1cf50 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
1cf60 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1cf70 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
1cf80 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
1cf90 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
1cfa0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
1cfb0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
1cfc0 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
1cfd0 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
1cfe0 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
1cff0 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
1d000 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
1d010 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
1d020 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
1d030 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
1d040 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
1d050 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1d060 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
1d070 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
1d080 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
1d090 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
1d0a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
1d0b0 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
1d0c0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1d0d0 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
1d0e0 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
1d0f0 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
1d100 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
1d110 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
1d120 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
1d130 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
1d140 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
1d150 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
1d160 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
1d170 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
1d180 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1d190 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
1d1a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
1d1b0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
1d1c0 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
1d1d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d1e0 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
1d1f0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
1d200 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
1d210 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d220 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1d230 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1d240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d250 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
1d260 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
1d270 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d280 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
1d290 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1d2a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d2b0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1d2c0 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
1d2d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
1d2e0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
1d2f0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1d300 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
1d310 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
1d320 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1d330 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1d340 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1d350 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
1d360 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
1d370 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
1d380 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d3a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d3b0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
1d3c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1d3d0 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
1d3e0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
1d3f0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
1d400 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1d410 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
1d420 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
1d430 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
1d440 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
1d450 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
1d460 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
1d470 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
1d480 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
1d490 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1d4a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
1d4b0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1d4c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1d4d0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1d4e0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1d4f0 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  ager,&pPager->jo
1d500 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b  urnalOff,0,1,0);
1d510 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d530 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b      nPlayback++;
1d540 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d550 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d560 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1d570 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d580 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1d590 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1d5a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1d5b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1d5c0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1d5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1d5e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1d5f0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1d600 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1d610 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1d620 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1d630 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1d640 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1d650 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1d660 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1d670 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1d680 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1d690 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1d6a0 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1d6b0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1d6c0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1d6d0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1d6e0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1d6f0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1d700 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1d710 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1d720 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1d730 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1d740 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d750 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1d760 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d770 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1d780 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1d790 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1d7a0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1d7b0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1d7c0 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1d7d0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1d7e0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1d7f0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1d800 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1d810 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1d820 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1d830 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1d840 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1d850 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1d860 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1d870 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1d880 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1d890 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1d8a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d8b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1d8c0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1d8d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d8e0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1d8f0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1d900 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1d910 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
1d920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1d940 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
1d950 72 2c 20 26 73 61 76 65 64 50 61 67 65 53 69 7a  r, &savedPageSiz
1d960 65 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a  e, -1);.  }.  /*
1d970 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
1d980 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
1d990 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1d9a0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
1d9b0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
1d9c0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
1d9d0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
1d9e0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
1d9f0 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
1da00 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1da10 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
1da20 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
1da30 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
1da40 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
1da50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1da60 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
1da70 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ed..  */.#ifdef 
1da80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
1da90 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1daa0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
1dab0 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  fd,SQLITE_FCNTL_
1dac0 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b  DB_UNCHANGED,0);
1dad0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1dae0 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1daf0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1db00 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1db10 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1db20 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1db30 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1db40 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1db50 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1db60 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1db70 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1db80 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1db90 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1dba0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1dbb0 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1dbc0 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1dbd0 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1dbe0 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1dbf0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1dc00 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1dc10 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1dc20 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1dc30 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1dc40 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1dc50 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1dc60 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1dc70 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1dc80 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1dc90 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1dca0 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1dcb0 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1dcc0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1dcd0 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1dce0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1dcf0 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1dd00 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1dd10 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1dd20 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1dd30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1dd40 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1dd50 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1dd60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd70 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1dd80 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1dd90 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1dda0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1ddb0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1ddc0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1ddd0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1dde0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1ddf0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1de00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1de10 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1de20 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1de30 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1de40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1de50 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1de60 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1de70 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1de80 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1de90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dea0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1deb0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1dec0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1ded0 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1dee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1def0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1df00 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1df10 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1df20 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1df30 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1df40 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1df50 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1df60 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1df70 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1df80 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1df90 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1dfa0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1dfb0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1dfc0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1dfd0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1dfe0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1dff0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1e000 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1e010 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1e020 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1e030 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1e040 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1e050 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1e060 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1e070 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1e080 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1e090 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1e0a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1e0b0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1e0c0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1e0d0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1e0e0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1e0f0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1e100 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1e110 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1e120 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1e130 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1e140 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1e150 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1e160 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1e170 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1e180 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1e190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1e1a0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1e1b0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1e1c0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1e1d0 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20  tabase file (or 
1e1e0 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41  out of.** the WA
1e1f0 4c 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65  L if that is whe
1e200 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  re the most rece
1e210 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64  nt copy if found
1e220 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  ) into .** pPg->
1e230 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1e240 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1e250 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1e260 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1e270 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1e280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e290 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1e2a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1e2b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1e2c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1e2d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1e2e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1e2f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e300 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1e310 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1e320 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1e330 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e340 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1e350 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1e360 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e370 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e380 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1e390 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1e3a0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e3b0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1e3c0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1e3d0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1e3e0 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  pPg */.  int rc 
1e3f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1e400 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e410 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  code */..#ifndef
1e420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e430 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20  .  u32 iFrame = 
1e440 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e450 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57 41 4c 20  /* Frame of WAL 
1e460 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20  containing pgno 
1e470 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1e480 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1e490 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d  GER_READER && !M
1e4a0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1e4b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1e4c0 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  >fd) );..  if( p
1e4d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1e4e0 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  r) ){.    rc = s
1e4f0 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e500 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e510 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e520 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e530 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e540 7d 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29  }.  if( iFrame )
1e550 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e560 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1e570 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1e580 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61 67 65  ame,pPager->page
1e590 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74 61 29  Size,pPg->pData)
1e5a0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1e5b0 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1e5c0 66 73 65 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e  fset = (pPg->pgn
1e5d0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1e5e0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1e5f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1e600 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1e610 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65  Pg->pData, pPage
1e620 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
1e630 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1e640 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1e650 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1e660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e670 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1e680 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
1e690 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1e6a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1e6b0 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1e6c0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1e6d0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1e6e0 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1e6f0 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1e700 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1e710 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1e720 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1e730 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1e740 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1e750 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1e760 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1e770 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1e780 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1e790 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e7a0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1e7b0 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1e7c0 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1e7d0 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1e7e0 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1e7f0 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1e800 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1e810 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1e820 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1e830 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1e840 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1e850 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1e860 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1e870 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1e880 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1e890 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1e8a0 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1e8b0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1e8c0 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1e8d0 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1e8e0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1e8f0 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1e900 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ise equaling 16 
1e910 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1e920 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1e930 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1e940 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1e950 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1e960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1e970 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1e980 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1e990 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1e9a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e9b0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1e9c0 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1e9d0 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1e9e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1e9f0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1ea00 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1ea10 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1ea20 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1ea30 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1ea40 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1ea50 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20  Pg->pgno, 3, rc 
1ea60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1ea70 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1ea80 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ea90 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1eaa0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1eab0 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1eac0 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1ead0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1eae0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1eaf0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1eb00 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1eb10 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1eb30 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1eb40 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
1eb50 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1eb60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1eb70 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1eb80 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1eb90 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1eba0 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1ebb0 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1ebc0 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1ebd0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1ebe0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1ebf0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1ec00 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1ec10 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1ec20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1ec30 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1ec40 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1ec50 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1ec60 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ec70 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1ec80 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1ec90 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1eca0 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1ecb0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1ecc0 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1ecd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ece0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1ecf0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1ed00 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1ed10 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1ed20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1ed30 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1ed40 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1ed50 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1ed60 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1ed70 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1ed80 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1ed90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1eda0 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1edb0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1edc0 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1edd0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1ede0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1edf0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1ee00 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1ee10 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1ee20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1ee30 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1ee40 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1ee50 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1ee60 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1ee70 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1ee80 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1ee90 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1eea0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1eeb0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1eec0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1eed0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1eee0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1eef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ef00 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1ef10 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1ef20 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1ef30 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1ef40 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1ef50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ef60 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1ef70 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ef80 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1ef90 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1efa0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1efb0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1efc0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1efd0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1efe0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1eff0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1f000 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1f010 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1f020 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1f030 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1f040 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1f050 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1f060 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1f070 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1f080 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1f090 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1f0a0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1f0b0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1f0c0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1f0d0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1f0e0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1f0f0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1f100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f110 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1f120 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1f130 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f140 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1f150 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1f160 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1f170 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1f180 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1f190 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f1a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f1b0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1f1c0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1f1d0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1f1e0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f1f0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1f200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1f210 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1f220 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1f230 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1f240 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1f250 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1f260 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1f270 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1f280 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f290 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1f2a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f2c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1f2d0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1f2e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1f2f0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1f300 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1f310 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1f320 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1f330 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1f340 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1f350 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1f360 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1f370 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1f380 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1f390 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1f3a0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1f3b0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1f3c0 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1f3d0 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1f3e0 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1f3f0 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1f400 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1f410 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1f420 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1f430 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1f440 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1f450 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f460 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1f470 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1f480 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1f490 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1f4a0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1f4b0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1f4c0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1f4d0 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1f4e0 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1f4f0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1f500 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1f510 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1f520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f530 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f540 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1f550 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1f560 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1f570 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1f580 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1f590 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1f5a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f5d0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1f5e0 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1f5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1f600 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1f610 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1f620 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1f630 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1f640 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1f650 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1f660 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1f670 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1f680 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1f690 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1f6a0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1f6b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1f6c0 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1f6d0 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1f6e0 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1f6f0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1f700 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1f710 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1f720 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1f730 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1f740 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1f750 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1f760 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1f770 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1f780 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1f790 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1f7a0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1f7b0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f7c0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f7d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f7e0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1f7f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f800 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1f810 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1f820 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1f830 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f840 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1f850 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1f860 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1f870 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1f8a0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1f8b0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1f8c0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1f8d0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1f8e0 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1f8f0 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1f900 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1f910 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1f920 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1f930 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1f940 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1f950 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1f960 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1f970 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1f980 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f990 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1f9a0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1f9b0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1f9c0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1f9d0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1f9e0 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1f9f0 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1fa00 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1fa10 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1fa20 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1fa30 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1fa40 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1fa50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1fa60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1fa70 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa90 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1faa0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1fab0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1fac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1fad0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1fae0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1faf0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1fb20 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1fb30 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1fb60 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1fb70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1fb80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fb90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1fba0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1fbb0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1fbd0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1fbe0 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1fbf0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1fc00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1fc10 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1fc20 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1fc30 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1fc40 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1fc50 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1fc60 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1fc70 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1fc80 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1fc90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1fca0 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1fcb0 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1fcc0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1fcd0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1fce0 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1fcf0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1fd00 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1fd10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1fd20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1fd30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1fd40 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1fd50 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1fd60 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1fd70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1fd80 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1fd90 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1fda0 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1fdb0 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1fdc0 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1fdd0 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1fde0 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1fdf0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1fe00 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1fe10 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1fe20 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1fe30 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1fe40 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1fe50 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1fe60 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1fe70 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1fe80 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1fe90 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1fea0 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1feb0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1fec0 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1fed0 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1fee0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1fef0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1ff00 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1ff10 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1ff20 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1ff30 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1ff40 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1ff50 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1ff60 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1ff70 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1ff80 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1ff90 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1ffa0 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1ffb0 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1ffc0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ffd0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1ffe0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1fff0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
20000 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
20010 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
20020 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
20030 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
20040 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
20050 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
20060 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
20070 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
20080 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
20090 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
200a0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
200b0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
200c0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
200d0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
200e0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
200f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20100 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
20110 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
20120 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
20130 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20140 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
20150 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
20160 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
20170 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
20180 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
20190 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
201a0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
201b0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
201c0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
201d0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
201e0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
201f0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
20200 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
20210 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
20220 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
20230 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
20240 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
20250 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
20260 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
20270 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20290 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
202a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
202b0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
202c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
202d0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
202e0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
202f0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
20300 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
20310 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20320 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
20330 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
20340 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
20350 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
20360 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20370 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
20380 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
20390 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
203a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
203b0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
203c0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
203d0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
203e0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
203f0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
20400 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
20410 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
20420 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
20430 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
20440 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
20450 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
20460 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20470 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
20480 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
20490 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
204a0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
204b0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
204c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
204d0 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
204e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
204f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
20500 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
20510 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
20520 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
20530 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
20540 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
20550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20560 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20570 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
20580 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
20590 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
205a0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
205b0 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
205c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
205d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
205e0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
205f0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
20600 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
20610 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
20620 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
20630 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
20640 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20650 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
20660 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20670 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
20680 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
20690 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
206a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
206b0 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
206c0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
206d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
206e0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
206f0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
20700 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
20710 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
20720 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
20730 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
20740 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20750 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20760 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
20770 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
20780 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
20790 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
207a0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
207b0 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
207c0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
207d0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
207e0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
207f0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
20800 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
20810 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20820 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
20830 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
20840 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
20850 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
20860 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
20870 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
20880 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
20890 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
208a0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
208b0 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
208c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
208d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
208e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
208f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20900 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
20910 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
20920 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
20930 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
20940 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20950 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20  e==0 );.  nPage 
20960 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
20970 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
20980 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
20990 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
209a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
209b0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
209c0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41  from the.  ** WA
209d0 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65  L sub-system, de
209e0 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65  termine the page
209f0 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e 20   count based on 
20a00 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
20a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20a20 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
20a30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20a40 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
20a50 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
20a60 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
20a70 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
20a80 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
20a90 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
20aa0 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65   && ALWAYS(isOpe
20ab0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
20ac0 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
20af0 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
20b00 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
20b10 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
20b20 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
20b30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20b60 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
20b70 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
20b80 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
20b90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20ba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
20bb0 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
20bc0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
20bd0 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
20be0 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
20bf0 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
20c00 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
20c10 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
20c20 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
20c30 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
20c40 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
20c50 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
20c60 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
20c70 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
20c80 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
20c90 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
20ca0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
20cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20cc0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
20cd0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
20ce0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
20cf0 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
20d00 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
20d10 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
20d20 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
20d30 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
20d40 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
20d50 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
20d60 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
20d70 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
20d80 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
20d90 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
20da0 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
20db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
20dc0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
20dd0 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
20de0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
20df0 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
20e00 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
20e10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
20e20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
20e30 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
20e40 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
20e50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
20e60 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
20e70 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
20e80 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
20e90 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20ea0 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
20eb0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
20ec0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
20ed0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
20ee0 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
20ef0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20f00 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
20f10 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
20f20 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
20f30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
20f40 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
20f50 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
20f60 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
20f70 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
20f80 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
20f90 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
20fa0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
20fb0 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
20fc0 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
20fd0 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
20fe0 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
20ff0 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
21000 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
21010 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21020 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
21030 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21050 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
21060 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
21070 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
21080 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21090 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
210a0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
210b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
210c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
210d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
210e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
210f0 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
21100 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
21110 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
21120 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
21130 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
21140 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
21150 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
21160 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
21170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21180 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
21190 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  .        Pgno nP
211a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
211b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
211c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
211d0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ile */..        
211e0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
211f0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
21200 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
21210 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21220 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
21230 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
21240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21250 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
21260 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
21270 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
21280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21290 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
212a0 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
212b0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
212c0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
212d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
212e0 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
212f0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
21300 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
21310 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21320 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
21330 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
21340 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21350 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
21360 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21370 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
21380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21390 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
213a0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
213b0 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
213c0 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
213d0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
213e0 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
213f0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
21400 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
21410 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
21420 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
21430 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
21440 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
21450 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
21460 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
21470 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
21480 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
21490 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
214a0 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
214b0 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
214c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
214d0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
214e0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
214f0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
21500 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
21510 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
21520 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
21530 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
21540 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
21550 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
21560 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21570 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21580 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
21590 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
215a0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
215b0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
215c0 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
215d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
215e0 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
215f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
21600 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
21610 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
21620 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21630 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
21640 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
21650 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21660 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
21670 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21680 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
21690 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
216a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
216b0 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
216c0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
216d0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
216e0 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
216f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
21700 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
21710 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
21720 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
21730 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
21740 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
21750 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
21760 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
21770 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
21780 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21790 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
217a0 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
217b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
217c0 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
217d0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
217e0 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
217f0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
21800 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
21810 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
21820 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
21830 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
21840 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
21850 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
21860 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
21870 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
21880 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
21890 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
218a0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
218b0 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
218c0 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
218d0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
218e0 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
218f0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21900 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
21910 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
21920 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
21930 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
21940 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
21950 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
21960 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
21970 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
21980 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
21990 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
219a0 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
219b0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
219c0 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
219d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
219e0 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
219f0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
21a00 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
21a10 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
21a20 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
21a30 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
21a40 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
21a50 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
21a60 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
21a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21a80 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
21a90 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
21aa0 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
21ab0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
21ac0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ae0 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
21af0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21b00 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
21b10 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
21b20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
21b30 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
21b40 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
21b50 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
21b60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
21b70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21b80 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
21b90 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
21ba0 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
21bb0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
21bc0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
21bd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21be0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
21bf0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
21c00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
21c10 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
21c20 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
21c30 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
21c40 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
21c50 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
21c60 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21c70 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21c80 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
21c90 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
21ca0 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
21cb0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
21cc0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
21cd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21ce0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
21cf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
21d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
21d10 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
21d20 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
21d30 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
21d40 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
21d50 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
21d60 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
21d70 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
21d80 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
21d90 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
21da0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
21db0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
21dc0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
21dd0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
21de0 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
21df0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
21e00 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
21e10 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
21e20 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
21e30 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
21e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21e50 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
21e60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21e70 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
21e80 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
21e90 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
21ea0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
21eb0 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
21ec0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
21ed0 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
21ee0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
21ef0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
21f00 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
21f10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21f20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
21f30 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
21f40 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21f50 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
21f60 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21f70 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
21f80 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21f90 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
21fa0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
21fb0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21fc0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
21fd0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21fe0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
21ff0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
22000 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
22010 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
22020 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
22030 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22040 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
22050 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
22060 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
22070 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
22080 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
22090 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
220a0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
220b0 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
220c0 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
220d0 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
220e0 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
220f0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
22100 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
22110 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
22120 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
22130 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
22140 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
22150 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
22160 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
22170 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
22180 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
22190 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
221a0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
221b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
221c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
221d0 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
221e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
221f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22200 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
22210 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
22220 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
22230 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22240 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22250 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22260 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
22270 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
22280 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
22290 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
222a0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
222b0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
222c0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
222d0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
222e0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
222f0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
22300 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
22310 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22320 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
22330 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
22340 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
22350 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
22360 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
22370 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
22380 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
22390 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
223a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
223b0 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
223c0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
223d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
223e0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
223f0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
22400 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
22410 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
22420 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
22430 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
22440 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
22450 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
22460 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
22470 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22480 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
22490 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
224a0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
224b0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
224c0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
224d0 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
224e0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
224f0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
22500 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
22510 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
22520 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
22530 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
22540 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
22550 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
22560 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
22570 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
22580 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22590 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
225a0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
225b0 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
225c0 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
225d0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
225e0 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
225f0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
22600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
22610 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
22620 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
22630 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
22640 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
22650 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22660 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22670 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
22680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22690 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
226a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
226b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
226c0 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
226d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
226e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
226f0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
22700 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
22710 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
22720 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
22730 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
22740 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
22750 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
22760 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
22770 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
22780 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
22790 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
227a0 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
227b0 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
227c0 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
227d0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
227e0 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
227f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22800 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22810 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
22820 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
22830 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
22840 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22850 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
22860 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
22870 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22880 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
22890 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
228a0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
228b0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
228c0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
228d0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
228e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
228f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
22900 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
22910 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
22920 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
22930 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
22940 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22950 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
22960 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
22970 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
22980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22990 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
229a0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
229b0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
229c0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
229d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
229e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
229f0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
22a00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
22a20 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
22a30 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
22a40 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
22a50 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
22a60 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
22a70 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
22a80 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
22a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22aa0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
22ab0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22ac0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22ad0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22ae0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
22af0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22b00 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
22b10 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22b20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
22b30 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
22b40 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
22b50 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
22b60 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
22b70 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
22b80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
22b90 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
22ba0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
22bb0 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
22bc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22bd0 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
22be0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22bf0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
22c00 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
22c10 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
22c20 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
22c30 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
22c40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22c50 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
22c60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22c70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
22c80 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
22c90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
22ca0 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
22cb0 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
22cc0 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
22cd0 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
22ce0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22cf0 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
22d00 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
22d10 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
22d20 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
22d30 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
22d40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
22d50 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
22d60 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
22d70 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
22d80 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
22d90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
22da0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22db0 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
22dc0 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
22dd0 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
22de0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
22df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22e00 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
22e10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
22e20 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
22e30 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
22e40 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
22e50 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
22e60 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
22e70 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
22e80 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
22e90 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
22ea0 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
22eb0 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
22ec0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22ed0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22ee0 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
22ef0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
22f00 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
22f10 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
22f20 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22f30 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
22f40 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
22f50 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
22f60 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22f70 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22f80 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
22f90 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
22fa0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
22fb0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
22fc0 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
22fd0 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
22fe0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
22ff0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
23000 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
23010 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
23020 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a  are four levels:
23030 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
23040 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
23050 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
23060 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
23070 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
23080 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
23090 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
230a0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
230b0 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
230c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
230d0 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
230e0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
230f0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
23100 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
23110 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
23120 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
23130 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
23140 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
23150 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
23160 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
23170 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
23180 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
23190 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
231a0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
231b0 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
231c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
231d0 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
231e0 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
231f0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
23200 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
23210 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
23220 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
23230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
23240 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
23250 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
23260 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
23270 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
23290 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
232a0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
232b0 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
232c0 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
232d0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
232e0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
232f0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
23300 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
23310 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
23320 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
23330 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
23340 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
23350 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
23360 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
23370 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
23380 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
233a0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
233b0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
233c0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
233d0 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
233e0 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
233f0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
23400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
23410 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
23420 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20  *.**    EXTRA   
23430 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46    This is like F
23440 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20  ULL except that 
23450 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68  is also syncs th
23460 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20  e directory.**  
23470 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
23480 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
23490 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
234a0 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63  fter the rollbac
234b0 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
234c0 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c    journal is unl
234d0 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inked..**.** The
234e0 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
234f0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
23500 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
23510 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
23520 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
23530 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
23540 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
23550 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
23560 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
23570 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
23580 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
23590 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
235a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
235b0 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
235c0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
235d0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
235e0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
235f0 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
23600 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
23610 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
23620 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
23630 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
23640 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
23650 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
23660 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
23670 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
23680 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
23690 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
236a0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
236b0 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
236c0 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
236d0 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
236e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
236f0 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73  ORMAL.  There is
23700 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
23710 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61  etween FULL.** a
23720 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c  nd EXTRA for WAL
23730 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20   mode..**.** Do 
23740 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
23750 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
23760 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
23770 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
23780 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
23790 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
237a0 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
237b0 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
237c0 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
237d0 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
237e0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
237f0 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
23800 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
23810 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
23820 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
23830 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
23840 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
23850 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23860 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
23870 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
23880 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
23890 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
238a0 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
238b0 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
238c0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
238d0 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
238e0 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
238f0 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
23900 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
23910 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
23920 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
23930 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
23940 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
23950 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
23960 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
23970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23980 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
23990 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
239a0 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65  SetFlags(.  Page
239b0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
239c0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
239d0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
239e0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  el for */.  unsi
239f0 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
23a00 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
23a10 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  gs */.){.  unsig
23a20 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c  ned level = pgFl
23a30 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
23a40 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
23a50 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
23a60 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
23a70 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
23a80 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
23a90 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
23aa0 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23ab0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
23ac0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
23ad0 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52   =  level==PAGER
23ae0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
23af0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
23b00 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
23b10 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel>=PAGER_SYNCH
23b20 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30  RONOUS_FULL ?1:0
23b30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
23b40 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  traSync = level=
23b50 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23b60 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20  US_EXTRA ?1:0;. 
23b70 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
23b80 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
23b90 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23ba0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23bb0 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23bc0 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
23bd0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23be0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23bf0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
23c00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23c10 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23c20 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23c30 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
23c40 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61 67  yncFlags = (pPag
23c50 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c 32  er->syncFlags<<2
23c60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
23c70 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
23c80 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23c90 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72 2d  Flags |= pPager-
23ca0 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d 0a  >syncFlags;.  }.
23cb0 20 20 69 66 28 20 28 70 67 46 6c 61 67 73 20 26    if( (pgFlags &
23cc0 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
23cd0 46 53 59 4e 43 29 20 26 26 20 21 70 50 61 67 65  FSYNC) && !pPage
23ce0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
23cf0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23d00 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  Flags |= (SQLITE
23d10 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a  _SYNC_FULL<<2);.
23d20 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
23d30 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
23d40 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
23d50 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
23d60 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
23d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23d80 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
23d90 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
23da0 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
23db0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23dc0 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
23dd0 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
23de0 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
23df0 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
23e00 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
23e10 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23e20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
23e30 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
23e40 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
23e50 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
23e60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23e70 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
23e80 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
23e90 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
23ea0 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
23eb0 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
23ec0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
23ed0 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
23ee0 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
23ef0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
23f00 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
23f10 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
23f20 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
23f30 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
23f40 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
23f50 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
23f60 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
23f70 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
23f80 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
23f90 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
23fa0 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
23fb0 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
23fc0 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
23fd0 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
23fe0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
23ff0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
24000 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24010 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
24020 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
24030 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
24040 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
24050 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
24060 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
24070 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
24080 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
24090 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
240a0 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
240b0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
240c0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
240d0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
240e0 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
240f0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
24100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
24110 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
24120 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
24130 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
24140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24150 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
24160 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24170 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
24180 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
24190 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
241a0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
241b0 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
241c0 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
241d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
241e0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
241f0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
24200 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
24210 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
24220 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
24230 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
24240 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
24250 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
24260 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
24270 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
24280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
24290 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
242a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
242b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
242c0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
242d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
242e0 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
242f0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
24300 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
24310 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
24320 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
24330 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
24340 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
24350 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
24360 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
24370 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
24380 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
24390 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
243a0 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
243b0 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
243c0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
243d0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
243e0 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
243f0 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
24400 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
24410 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
24420 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
24430 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
24440 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
24450 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
24460 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
24470 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
24480 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
24490 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
244a0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
244b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
244c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
244d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
244e0 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
244f0 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
24500 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
24510 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
24520 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
24530 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
24540 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
24550 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
24560 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
24570 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
24580 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
24590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
245a0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
245b0 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
245c0 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
245d0 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
245e0 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
245f0 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
24600 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
24610 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
24620 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
24630 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
24640 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
24650 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
24660 79 48 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yHandler(.  Page
24670 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
246a0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
246b0 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
246c0 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
246d0 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
246e0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
246f0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
24700 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
24710 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
24720 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
24730 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
24740 29 7b 0a 20 20 76 6f 69 64 20 2a 2a 61 70 3b 0a  ){.  void **ap;.
24750 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
24760 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
24770 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
24780 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
24790 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
247a0 72 67 3b 0a 20 20 61 70 20 3d 20 28 76 6f 69 64  rg;.  ap = (void
247b0 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75   **)&pPager->xBu
247c0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 61 73 73  syHandler;.  ass
247d0 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f  ert( ((int(*)(vo
247e0 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d  id *))(ap[0]))==
247f0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a  xBusyHandler );.
24800 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
24810 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
24820 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 46   );.  sqlite3OsF
24830 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
24840 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
24850 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
24860 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
24870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
24880 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
24890 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
248a0 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
248b0 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
248c0 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
248d0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
248e0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
248f0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
24900 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
24910 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
24920 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
24930 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
24940 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
24950 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
24960 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
24970 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
24980 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
24990 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
249a0 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
249b0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
249c0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
249d0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
249e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
249f0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
24a00 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
24a10 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
24a20 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
24a30 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
24a40 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
24a50 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
24a60 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
24a70 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
24a80 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
24a90 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
24aa0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
24ab0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
24ac0 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
24ad0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
24ae0 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
24af0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
24b00 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
24b10 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
24b20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
24b30 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
24b40 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
24b50 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
24b60 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
24b70 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
24b80 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
24b90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
24ba0 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
24bb0 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
24bc0 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
24bd0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
24be0 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
24bf0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
24c00 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
24c10 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
24c20 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
24c30 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
24c40 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
24c50 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
24c60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24c70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
24c80 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
24c90 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
24ca0 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
24cb0 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
24cc0 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
24cd0 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
24ce0 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
24cf0 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
24d00 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
24d10 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
24d20 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
24d30 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
24d40 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
24d50 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
24d60 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
24d70 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
24d80 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
24d90 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
24da0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24db0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
24dc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
24dd0 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
24de0 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
24df0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24e00 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
24e10 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
24e20 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
24e30 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
24e40 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
24e50 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
24e60 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
24e70 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
24e80 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
24e90 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
24ea0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
24eb0 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
24ec0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
24ed0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
24ee0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24ef0 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
24f00 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
24f10 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
24f20 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
24f30 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
24f40 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
24f50 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
24f60 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
24f70 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
24f80 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
24f90 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
24fa0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
24fb0 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
24fc0 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
24fd0 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
24fe0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
24ff0 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
25000 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
25010 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
25020 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
25030 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
25040 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
25050 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
25060 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
25070 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
25080 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
25090 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
250a0 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
250b0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
250c0 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
250d0 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
250e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
250f0 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
25100 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
25110 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
25120 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
25130 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
25140 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
25150 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25160 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
25170 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
25180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
25190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
251a0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
251b0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
251c0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
251d0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
251e0 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
251f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25200 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
25210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25220 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
25230 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
25240 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
25250 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
25260 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
25270 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
25280 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
252a0 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
252b0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
252c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
252d0 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
252e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
252f0 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Size = (Pgno)((n
25300 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29  Byte+pageSize-1)
25310 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  /pageSize);.    
25320 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
25330 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
25340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25350 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25360 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNew);.    }.  }
25370 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
25380 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
25390 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
253a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
253b0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
253c0 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
253d0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
253e0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
253f0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
25400 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
25410 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
25420 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
25430 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
25440 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
25450 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
25460 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
25470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25480 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
25490 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
254a0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
254b0 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
254c0 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
254d0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
254e0 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
254f0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
25500 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
25510 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
25520 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
25530 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
25540 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
25550 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
25560 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
25570 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
25580 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
25590 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
255a0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
255b0 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
255c0 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
255d0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
255e0 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
255f0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
25600 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
25610 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
25620 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
25630 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
25640 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
25650 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
25660 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
25670 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
25680 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
25690 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
256a0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
256b0 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
256c0 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
256d0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
256e0 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
256f0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
25700 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
25710 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
25720 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
25730 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
25740 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
25750 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25760 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
25770 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25780 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
25790 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
257a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
257b0 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
257c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
257d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
257e0 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
257f0 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
25800 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
25810 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
25820 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
25830 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
25840 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
25850 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
25860 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
25870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
25880 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
25890 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
258a0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
258b0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
258c0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
258d0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
258e0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
258f0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
25900 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
25910 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
25920 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
25930 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
25940 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
25950 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
25960 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
25970 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
25980 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
25990 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
259a0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
259b0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
259c0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
259d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
259e0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
259f0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
25a00 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
25a10 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25a20 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
25a30 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
25a40 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25a50 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
25a60 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
25a70 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
25a80 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25a90 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
25aa0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25ab0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
25ac0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
25ad0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
25ae0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25af0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
25b00 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25b10 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
25b20 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
25b30 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
25b40 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
25b50 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
25b60 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
25b70 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
25b80 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
25b90 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
25ba0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
25bb0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
25bc0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
25bd0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
25be0 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
25bf0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
25c00 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
25c10 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
25c20 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
25c30 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
25c40 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
25c50 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
25c60 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
25c70 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
25c80 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
25c90 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
25ca0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
25cb0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
25cc0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
25cd0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
25ce0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
25cf0 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
25d00 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
25d10 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
25d20 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
25d30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25d40 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
25d50 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
25d60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
25d70 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
25d80 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
25d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
25da0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
25db0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
25dc0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
25dd0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
25de0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25df0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
25e00 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
25e10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25e20 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
25e30 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
25e40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25e50 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
25e60 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
25e70 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
25e80 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
25e90 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
25ea0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
25eb0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
25ec0 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
25ed0 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
25ee0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
25ef0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
25f00 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
25f10 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25f20 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
25f30 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
25f40 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
25f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25f60 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
25f70 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
25f80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25f90 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
25fa0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
25fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25fc0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
25fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
25fe0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
25ff0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
26000 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
26010 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
26020 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
26030 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
26040 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
26050 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
26060 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
26070 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
26080 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
26090 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
260a0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
260b0 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
260c0 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
260d0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
260e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
260f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
26100 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
26110 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26120 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
26130 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
26140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
26150 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
26160 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
26170 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
26180 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
26190 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
261a0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
261b0 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
261c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
261d0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
261e0 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
261f0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
26200 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
26210 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
26220 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
26230 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
26240 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
26250 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
26260 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
26270 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
26280 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
26290 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
262a0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
262b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
262c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
262d0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
262e0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
262f0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
26300 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
26310 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
26320 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
26330 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
26340 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
26350 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
26360 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
26370 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
26380 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
26390 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
263a0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
263b0 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
263c0 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
263d0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
263e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
263f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26400 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
26410 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
26420 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
26430 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26450 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
26460 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
26470 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
26480 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
26490 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
264a0 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
264b0 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29  ** already held)
264c0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
264d0 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74  transitions that
264e0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
264f0 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
26500 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
26510 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
26520 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
26530 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
26540 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
26550 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
26560 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
26570 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
26580 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
26590 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
265a0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
265b0 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
265c0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
265d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
265e0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
265f0 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
26600 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
26610 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
26620 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
26630 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
26640 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
26650 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
26660 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
26670 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
26680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26690 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
266a0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
266b0 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
266c0 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
266d0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
266e0 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
266f0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
26700 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
26710 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
26720 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
26730 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
26740 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
26750 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
26760 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
26770 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
26780 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
26790 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
267a0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
267b0 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
267c0 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
267d0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
267e0 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
267f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
26800 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
26810 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
26820 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
26830 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
26840 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
26850 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
26860 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
26870 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
26880 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
26890 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
268a0 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
268b0 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
268c0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
268d0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
268e0 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
268f0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
26900 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
26910 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
26920 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
26930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26940 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
26950 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
26960 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
26970 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
26980 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
26990 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20   behavior would 
269a0 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
269b0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
269c0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
269d0 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
269e0 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
269f0 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
26a00 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
26a10 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
26a20 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
26a30 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
26a40 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
26a50 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
26a60 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
26a70 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
26a80 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
26a90 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
26aa0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
26ab0 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
26ac0 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
26ad0 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
26ae0 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
26af0 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
26b00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
26b10 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
26b20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26b30 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
26b40 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
26b50 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
26b60 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
26b70 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
26b80 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
26b90 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
26ba0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
26bb0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
26bc0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26bd0 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
26be0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
26bf0 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
26c00 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
26c10 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
26c20 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
26c30 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
26c40 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
26c50 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
26c60 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
26c70 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
26c80 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
26c90 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
26ca0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
26cb0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
26cc0 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
26cd0 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
26ce0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
26cf0 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
26d00 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
26d10 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
26d20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
26d30 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
26d40 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
26d50 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
26d60 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
26d70 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
26d80 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
26d90 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
26da0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
26db0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
26dc0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63  nsaction..** Onc
26dd0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
26de0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  has been called,
26df0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26e00 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a   must either be.
26e10 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ** rolled back o
26e20 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20  r committed. It 
26e30 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63  is not safe to c
26e40 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
26e50 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f  n and.** then co
26e60 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74  ntinue writing t
26e70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
26e80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
26e90 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
26ea0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
26eb0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
26ec0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26ed0 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
26ee0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26ef0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
26f00 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
26f10 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
26f20 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20  Size = nPage;.. 
26f30 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
26f40 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63   the code here c
26f50 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e  alled assertTrun
26f60 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
26f70 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
26f80 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62  that all pages b
26f90 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61  eing truncated a
26fa0 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72  way by this oper
26fb0 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20  ation are,.  ** 
26fc0 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  if one or more s
26fd0 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70  avepoints are op
26fe0 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74  en, present in t
26ff0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
27000 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ** journal so th
27010 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
27020 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73  estored if the s
27030 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c  avepoint is roll
27040 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68  ed.  ** back. Th
27050 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
27060 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69  necessary as thi
27070 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
27080 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c  w only.  ** call
27090 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
270a0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
270b0 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74  nsaction. So alt
270c0 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20  hough the .  ** 
270d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79  Pager object may
270e0 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e   still have open
270f0 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67   savepoints (Pag
27100 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30  er.nSavepoint!=0
27110 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61  ), .  ** they ca
27120 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
27130 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65  ack. So the asse
27140 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
27150 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a  aint() call.  **
27160 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   is no longer co
27170 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  rrect. */.}.../*
27180 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
27190 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
271a0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
271b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
271c0 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
271d0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
271e0 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
271f0 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
27200 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
27210 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
27220 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
27230 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
27240 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
27250 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
27260 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
27270 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
27280 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
27290 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
272a0 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
272b0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
272c0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
272d0 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
272e0 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
272f0 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
27300 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
27310 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
27320 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
27330 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
27340 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
27350 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
27360 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
27370 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
27380 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
27390 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
273a0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
273b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
273c0 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
273d0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
273e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
273f0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
27400 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
27410 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
27420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
27430 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
27440 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
27450 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
27460 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
27470 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
27480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27490 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
274a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
274b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
274c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
274d0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
274e0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
274f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27500 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  >0./*.** Obtain 
27510 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
27520 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
27530 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
27540 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
27550 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
27560 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
27570 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
27580 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
27590 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
275a0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
275b0 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
275c0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
275d0 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
275e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
275f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
27600 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
27610 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
27620 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
27630 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
27640 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
27650 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
27660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
27670 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
27680 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
27690 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
276a0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
276b0 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
276c0 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
276d0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
276e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
276f0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
27700 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27720 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
27730 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
27760 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
27770 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
27780 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
27790 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
277a0 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
277b0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
277c0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277e0 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
277f0 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
27800 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  .  .  if( pPager
27810 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
27820 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
27830 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d   p = pPager->pMm
27840 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  apFreelist;.    
27850 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27860 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74  elist = p->pDirt
27870 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
27880 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
27890 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
278a0 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  >=8 );.    memse
278b0 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
278c0 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  8);.  }else{.   
278d0 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28   *ppPage = p = (
278e0 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d  PgHdr *)sqlite3M
278f0 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
27900 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72  (PgHdr) + pPager
27910 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69  ->nExtra);.    i
27920 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
27930 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
27940 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
27950 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
27960 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27970 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65  pData);.      re
27980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27990 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
279a0 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76    p->pExtra = (v
279b0 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  oid *)&p[1];.   
279c0 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44   p->flags = PGHD
279d0 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e  R_MMAP;.    p->n
279e0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e  Ref = 1;.    p->
279f0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
27a00 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
27a10 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64  p->pExtra==(void
27a20 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73   *)&p[1] );.  as
27a30 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d  sert( p->pPage==
27a40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27a50 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d  ->flags==PGHDR_M
27a60 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MAP );.  assert(
27a70 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67   p->pPager==pPag
27a80 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
27a90 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20  p->nRef==1 );.. 
27aa0 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b   p->pgno = pgno;
27ab0 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44  .  p->pData = pD
27ac0 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ata;.  pPager->n
27ad0 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65  MmapOut++;..  re
27ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27af0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27b00 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
27b10 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e  nce to page pPg.
27b20 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62   pPg must have b
27b30 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  een returned by 
27b40 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63  an .** earlier c
27b50 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75  all to pagerAcqu
27b60 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  ireMapPage()..*/
27b70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
27b80 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
27b90 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
27ba0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27bb0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  pPg->pPager;.  p
27bc0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d  Pager->nMmapOut-
27bd0 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  -;.  pPg->pDirty
27be0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
27bf0 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67  Freelist;.  pPag
27c00 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27c10 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65  t = pPg;..  asse
27c20 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  rt( pPager->fd->
27c30 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
27c40 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  on>=3 );.  sqlit
27c50 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
27c60 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50  er->fd, (i64)(pP
27c70 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  g->pgno-1)*pPage
27c80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67  r->pageSize, pPg
27c90 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pData);.}../*.
27ca0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64  ** Free all PgHd
27cb0 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64  r objects stored
27cc0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d   in the Pager.pM
27cd0 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74  mapFreelist list
27ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27cf0 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
27d00 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
27d10 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
27d20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20  PgHdr *pNext;.  
27d30 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d  for(p=pPager->pM
27d40 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20  mapFreelist; p; 
27d50 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
27d60 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ext = p->pDirty;
27d70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27d80 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  e(p);.  }.}../* 
27d90 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
27da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
27db0 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  s not be deleted
27dc0 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20   or renamed out 
27dd0 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68  from.** under th
27de0 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  e pager.  Return
27df0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
27e00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
27e10 69 6c 6c 20 77 68 65 72 65 20 69 74 20 6f 75 67  ill where it oug
27e20 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
27e30 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
27e40 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
27e50 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
27e60 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
27e70 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
27e80 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
27e90 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
27ea0 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
27eb0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
27ec0 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
27ed0 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
27ee0 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
27ef0 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
27f00 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
27f10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
27f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27f30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
27f40 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
27f50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
27f60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
27f70 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
27f80 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
27f90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
27fa0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
27fb0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
27fc0 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
27fd0 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
27fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27ff0 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
28000 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
28010 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
28020 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
28030 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
28040 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
28050 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
28060 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
28070 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
28080 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
28090 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
280a0 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
280b0 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
280c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
280d0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
280e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
280f0 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
28100 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
28110 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
28120 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
28130 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68  rc;.}.../*.** Sh
28140 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
28150 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
28160 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
28170 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
28180 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
28190 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
281a0 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
281b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
281c0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
281d0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
281e0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
281f0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
28200 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
28210 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
28220 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
28230 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
28240 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
28250 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
28260 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
28270 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28280 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
28290 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
282a0 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
282b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
282c0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
282d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
282e0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
282f0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
28300 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
28310 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
28320 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
28330 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
28340 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
28350 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
28360 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
28370 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
28380 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
28390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
283a0 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
283b0 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65   *pPager, sqlite
283c0 33 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a 70 54  3 *db){.  u8 *pT
283d0 6d 70 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  mp = (u8*)pPager
283e0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
283f0 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70 61 67  ssert( db || pag
28400 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
28410 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28420 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28430 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28440 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
28450 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
28460 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
28470 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
28480 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
28490 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70  (pPager);.  /* p
284a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
284b0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
284c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
284d0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
284e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7b 0a  TE_OMIT_WAL.  {.
284f0 20 20 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20      u8 *a = 0;. 
28500 20 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c     assert( db ||
28510 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
28520 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26   );.    if( db &
28530 26 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 20  & 0==(db->flags 
28540 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f  & SQLITE_NoCkptO
28550 6e 43 6c 6f 73 65 29 20 0a 20 20 20 20 20 26 26  nClose) .     &&
28560 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64 61 74 61   SQLITE_OK==data
28570 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50  baseIsUnmoved(pP
28580 61 67 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  ager).    ){.   
28590 20 20 20 61 20 3d 20 70 54 6d 70 3b 0a 20 20 20     a = pTmp;.   
285a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61   }.    sqlite3Wa
285b0 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
285c0 57 61 6c 2c 20 64 62 2c 20 70 50 61 67 65 72 2d  Wal, db, pPager-
285d0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 2c 20 70  >walSyncFlags, p
285e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
285f0 61 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  a);.    pPager->
28600 70 57 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  pWal = 0;.  }.#e
28610 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
28620 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
28630 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
28640 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
28650 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
28660 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
28670 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
28680 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
28690 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
286a0 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
286b0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
286c0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
286d0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
286e0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
286f0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
28700 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
28710 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
28720 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
28730 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
28740 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
28750 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
28760 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
28770 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
28780 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
28790 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
287a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
287b0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
287c0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
287d0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
287e0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
287f0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
28800 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
28810 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
28820 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
28830 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
28840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
28850 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
28860 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
28870 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
28880 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
28890 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
288a0 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
288b0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
288c0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
288d0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
288e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
288f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
28900 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28910 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
28920 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
28930 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
28940 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
28950 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
28960 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
28970 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
28980 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
28990 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
289a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
289b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
289c0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
289d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
289e0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
289f0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
28a00 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
28a10 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
28a20 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
28a30 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
28a40 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
28a50 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
28a60 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
28a70 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
28a80 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
28a90 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
28aa0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
28ab0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
28ac0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
28ad0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
28ae0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
28af0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
28b00 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
28b10 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
28b20 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
28b30 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
28b40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
28b50 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
28b60 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
28b70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28b80 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
28b90 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
28ba0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
28bb0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
28bc0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28bd0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
28be0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
28bf0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
28c00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
28c10 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
28c20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
28c30 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
28c40 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
28c50 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
28c60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
28c70 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
28c80 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
28c90 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
28ca0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
28cb0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
28cc0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
28cd0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
28ce0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
28cf0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
28d00 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
28d10 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
28d20 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
28d30 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
28d40 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
28d50 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
28d60 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28d70 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
28d80 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
28d90 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
28da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28db0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
28dc0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
28dd0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
28de0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
28df0 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
28e00 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
28e10 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
28e20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
28e30 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
28e40 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
28e50 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
28e60 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
28e70 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
28e80 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
28e90 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
28ea0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
28eb0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
28ec0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
28ed0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
28ee0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
28ef0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
28f00 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
28f10 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
28f20 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
28f30 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
28f40 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
28f50 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
28f60 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
28f70 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
28f80 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
28f90 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
28fa0 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
28fb0 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
28fc0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
28fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28fe0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
28ff0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
29000 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
29010 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
29020 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
29030 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
29040 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
29050 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
29060 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
29070 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
29080 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
29090 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
290a0 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
290b0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
290c0 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
290d0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
290e0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
290f0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
29100 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
29110 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
29120 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
29130 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
29140 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
29150 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
29160 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
29170 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
29180 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
29190 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
291a0 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
291b0 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
291c0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
291d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
291e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
291f0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
29200 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
29210 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
29220 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29230 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
29240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
29250 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
29260 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
29270 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
292a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
292b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
292c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
292d0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
292e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
292f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
29300 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
29310 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
29320 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
29330 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
29340 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
29350 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
29360 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
29370 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
29380 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
29390 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
293a0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
293b0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
293c0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
293d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
293e0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
293f0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
29400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29410 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
29420 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
29430 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
29440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
29450 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
29460 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
29470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
29480 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
29490 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
294a0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
294b0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
294c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
294d0 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
294e0 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
294f0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
29500 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
29510 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
29520 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
29530 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
29540 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
29550 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
29560 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
29570 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
29580 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
29590 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
295a0 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
295b0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
295c0 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
295d0 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
295e0 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
295f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
29600 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
29610 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
29620 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
29630 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
29640 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
29650 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
29660 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
29670 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
29680 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
29690 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
296a0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
296b0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
296c0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
296d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
296e0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
296f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
29700 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
29710 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
29720 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
29730 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
29740 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
29750 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
29760 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
29770 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
29780 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
29790 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
297a0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
297b0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
297c0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
297d0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
297e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
297f0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
29800 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
29810 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
29820 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
29830 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
29840 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
29850 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
29860 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
29870 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
29880 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
29890 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
298a0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
298b0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
298c0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
298d0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
298e0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
298f0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
29900 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
29910 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
29920 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29930 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
29940 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
29950 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
29960 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
29970 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
29980 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
29990 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
299a0 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
299b0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
299c0 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
299d0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
299e0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
299f0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
29a00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
29a10 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
29a20 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
29a30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
29a40 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
29a50 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
29a60 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
29a70 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
29a80 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
29a90 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
29aa0 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
29ab0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
29ac0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29ad0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
29ae0 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
29af0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
29b00 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
29b10 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
29b20 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
29b30 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
29b40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
29b60 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
29b70 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
29b80 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
29b90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29ba0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
29bb0 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
29bc0 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
29bd0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
29be0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
29bf0 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
29c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29c10 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
29c20 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
29c30 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
29c40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29c50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29c60 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
29c70 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
29c80 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
29c90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29ca0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
29cb0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
29cc0 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
29cd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
29ce0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
29cf0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
29d00 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
29d10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
29d20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
29d30 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
29d40 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
29d50 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
29d60 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
29d70 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
29d80 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
29d90 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
29da0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
29db0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29dc0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
29dd0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
29de0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
29df0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
29e00 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
29e10 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
29e20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
29e30 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
29e40 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
29e50 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
29e60 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
29e70 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
29e80 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
29e90 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
29ea0 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
29eb0 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
29ec0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
29ed0 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
29ee0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
29ef0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
29f00 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
29f10 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29f20 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
29f30 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
29f40 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
29f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
29f60 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
29f70 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
29f80 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29f90 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
29fa0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
29fb0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
29fc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29fd0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
29fe0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
29ff0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
2a000 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a010 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a020 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2a030 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
2a040 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
2a050 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2a060 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
2a070 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a080 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
2a090 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2a0a0 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
2a0b0 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
2a0c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a0d0 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
2a0e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a0f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a100 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2a110 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
2a120 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
2a130 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
2a140 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2a150 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
2a160 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2a170 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
2a180 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
2a190 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
2a1a0 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
2a1b0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2a1c0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2a1d0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
2a1e0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
2a1f0 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
2a200 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
2a210 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
2a220 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
2a230 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2a240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a250 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2a260 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
2a270 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
2a280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
2a290 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
2a2a0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
2a2b0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
2a2c0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
2a2d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
2a2e0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2a2f0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
2a300 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
2a310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a320 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2a330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2a340 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
2a350 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
2a360 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2a370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2a380 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
2a390 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
2a3a0 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
2a3b0 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
2a3c0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
2a3d0 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
2a3e0 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
2a3f0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2a400 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
2a410 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
2a420 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
2a430 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
2a440 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2a450 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2a460 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
2a470 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
2a480 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
2a490 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
2a4a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a4b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
2a4c0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
2a4d0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
2a4e0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
2a4f0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
2a500 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
2a510 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
2a520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
2a530 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
2a540 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
2a550 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
2a560 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
2a570 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
2a580 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
2a590 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
2a5a0 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
2a5b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2a5c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
2a5d0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
2a5e0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
2a5f0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
2a600 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
2a610 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2a620 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
2a630 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
2a640 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
2a650 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2a660 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
2a670 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
2a680 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2a690 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
2a6a0 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
2a6b0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2a6c0 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
2a6d0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
2a6e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a6f0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
2a700 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
2a710 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
2a720 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
2a730 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
2a740 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
2a750 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
2a760 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
2a770 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
2a780 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
2a790 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
2a7a0 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
2a7b0 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
2a7c0 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
2a7d0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
2a7e0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
2a7f0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
2a800 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
2a810 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
2a820 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
2a830 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
2a840 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
2a850 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2a860 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
2a870 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
2a880 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
2a890 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
2a8a0 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
2a8b0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
2a8c0 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
2a8d0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
2a8e0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
2a8f0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
2a900 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
2a910 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
2a920 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
2a930 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
2a940 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
2a950 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
2a960 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
2a970 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
2a980 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
2a990 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
2a9a0 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
2a9b0 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
2a9c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2a9d0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2a9e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2a9f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2aa00 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2aa10 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
2aa20 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2aa30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
2aa40 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
2aa50 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
2aa60 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
2aa70 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2aa80 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2aa90 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
2aaa0 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
2aab0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
2aac0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
2aad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aaf0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2ab00 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2ab10 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
2ab20 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
2ab30 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
2ab40 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
2ab50 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
2ab60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ab70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ab80 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
2ab90 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2aba0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
2abb0 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
2abc0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2abd0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
2abe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2abf0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2ac00 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  || pList->pDirty
2ac10 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
2ac20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
2ac30 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
2ac40 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
2ac50 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
2ac60 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
2ac70 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
2ac80 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
2ac90 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
2aca0 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
2acb0 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
2acc0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
2acd0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
2ace0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
2acf0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2ad00 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
2ad10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
2ad20 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
2ad30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2ad40 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
2ad50 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
2ad60 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
2ad70 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
2ad80 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
2ad90 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
2ada0 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
2adb0 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
2adc0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
2add0 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
2ade0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2adf0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2ae00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2ae10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ae20 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65  _OK .   && pPage
2ae30 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50  r->dbHintSize<pP
2ae40 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20  ager->dbSize.   
2ae50 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74  && (pList->pDirt
2ae60 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  y || pList->pgno
2ae70 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
2ae80 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ize).  ){.    sq
2ae90 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
2aea0 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
2aeb0 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
2aec0 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
2aed0 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
2aee0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
2aef0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
2af00 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
2af10 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
2af20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
2af30 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
2af40 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
2af50 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2af60 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
2af70 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2af80 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
2af90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2afa0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
2afb0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
2afc0 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
2afd0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
2afe0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
2aff0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
2b000 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
2b010 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
2b020 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
2b030 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
2b040 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
2b050 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
2b060 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
2b070 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
2b080 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
2b090 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
2b0a0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
2b0b0 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
2b0c0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
2b0d0 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
2b0e0 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
2b0f0 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
2b100 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2b110 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
2b120 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
2b130 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
2b140 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
2b150 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
2b160 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
2b170 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
2b180 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
2b190 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
2b1a0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
2b1b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2b1c0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
2b1f0 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
2b200 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
2b210 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
2b220 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2b230 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2b240 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
2b250 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
2b260 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
2b270 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
2b280 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2b290 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2b2a0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
2b2b0 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
2b2c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2b2d0 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20  BKPT, pData);.. 
2b2e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
2b2f0 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
2b300 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2b310 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2b320 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
2b330 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2b340 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
2b350 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
2b360 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
2b370 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
2b380 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
2b390 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
2b3a0 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
2b3b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b3c0 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
2b3d0 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
2b3e0 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
2b3f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2b400 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
2b410 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
2b420 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2b430 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
2b440 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b450 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
2b460 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
2b470 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
2b480 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
2b490 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
2b4a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2b4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
2b4c0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
2b4d0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20   pgno;.      }. 
2b4e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
2b4f0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
2b500 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  ITE]++;..      /
2b510 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
2b520 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
2b530 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2b540 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
2b550 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2b560 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
2b570 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
2b580 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
2b590 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
2b5a0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
2b5b0 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
2b5c0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2b5e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b5f0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
2b600 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
2b610 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
2b620 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
2b630 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
2b640 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
2b650 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2b660 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
2b670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
2b680 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
2b690 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
2b6a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b6b0 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
2b6c0 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
2b6d0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
2b6e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
2b6f0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
2b700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b710 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
2b720 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
2b730 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
2b740 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
2b750 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
2b760 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2b770 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
2b780 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b790 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
2b7a0 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
2b7b0 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
2b7c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
2b7d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2b7e0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
2b7f0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
2b800 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
2b810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2b820 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
2b830 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2b840 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b850 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
2b860 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
2b870 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
2b880 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f  lags =  SQLITE_O
2b890 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
2b8a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2b8b0 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20  DWRITE .      | 
2b8c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2b8d0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
2b8e0 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20  _EXCLUSIVE .    
2b8f0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2b900 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
2b910 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c     int nStmtSpil
2b920 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  l = sqlite3Confi
2b930 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20  g.nStmtSpill;.  
2b940 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b950 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b960 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b970 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
2b980 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2b990 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20       nStmtSpill 
2b9a0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2b9b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2b9c0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
2b9d0 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d  pVfs, 0, pPager-
2b9e0 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53  >sjfd, flags, nS
2b9f0 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20  tmtSpill);.  }. 
2ba00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ba10 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
2ba20 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
2ba30 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
2ba40 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
2ba50 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a  -journal. .**.**
2ba60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2ba70 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
2ba80 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
2ba90 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
2baa0 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
2bab0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
2bac0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2bad0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
2bae0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2baf0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2bb00 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2bb10 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
2bb20 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
2bb30 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
2bb40 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
2bb50 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
2bb60 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
2bb70 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
2bb80 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
2bb90 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
2bba0 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
2bbb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2bbc0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
2bbd0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
2bbe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bbf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2bc00 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2bc10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2bc20 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2bc30 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2bc40 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
2bc50 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2bc60 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
2bc70 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2bc80 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
2bc90 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2bca0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
2bcb0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2bcc0 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
2bcd0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2bce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2bcf0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2bd00 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
2bd10 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
2bd20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2bd30 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
2bd40 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
2bd50 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70  ournal(pPager, p
2bd60 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
2bd70 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
2bd80 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2bd90 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
2bda0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2bdb0 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
2bdc0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2bdd0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
2bde0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
2bdf0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2be00 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
2be10 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2be20 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2be30 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2be40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2be50 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2be60 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2be70 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2be80 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2be90 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2bea0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2beb0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
2bec0 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
2bed0 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20 69 66  ODEC   .      if
2bee0 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  ( !pPager->subjI
2bef0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2bf00 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2bf10 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
2bf20 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
2bf30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
2bf40 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2bf50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2bf60 20 20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74     pData2 = pDat
2bf70 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  a;.      PAGERTR
2bf80 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2bf90 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2bfa0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2bfb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2bfc0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2bfd0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2bfe0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2bff0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2c000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c020 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2c030 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2c040 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2c050 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2c060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c070 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2c080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c090 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2c0a0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2c0b0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2c0c0 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2c0d0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2c0e0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2c0f0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2c100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2c110 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2c120 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2c130 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2c140 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2c150 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2c160 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e   return subjourn
2c170 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  alPage(pPg);.  }
2c180 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2c190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2c1a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2c1b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2c1c0 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
2c1d0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
2c1e0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
2c1f0 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
2c200 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
2c210 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
2c220 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
2c230 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
2c240 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
2c250 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
2c260 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
2c270 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
2c280 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
2c290 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2c2a0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2c2b0 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
2c2c0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
2c2d0 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
2c2e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2c2f0 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
2c300 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
2c310 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2c320 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
2c330 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
2c340 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
2c350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
2c360 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2c370 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
2c380 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
2c390 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2c3a0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2c3b0 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
2c3c0 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
2c3d0 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
2c3e0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2c3f0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
2c400 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
2c410 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2c420 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
2c430 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
2c440 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2c450 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2c460 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2c470 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
2c480 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
2c490 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
2c4a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2c4b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
2c4c0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
2c4d0 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
2c4e0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
2c4f0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2c500 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2c510 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2c520 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
2c530 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
2c540 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
2c550 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
2c560 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
2c570 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2c580 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
2c590 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
2c5a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2c5b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2c5c0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2c5d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2c5e0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2c5f0 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
2c600 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
2c610 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69   bit is set duri
2c620 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2c630 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2c640 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2c650 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2c660 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2c670 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2c680 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2c690 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2c6a0 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2c6b0 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2c6c0 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2c6d0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2c6e0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2c6f0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2c700 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f  he doNotSpill RO
2c710 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62  LLBACK and OFF b
2c720 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  its inhibits all
2c730 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a   cache spilling.
2c740 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
2c750 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2c760 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
2c770 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
2c780 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61  et during.  ** a
2c790 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20   rollback or by 
2c7a0 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65  user request, re
2c7b0 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a  spectively..  **
2c7c0 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
2c7d0 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
2c7e0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
2c7f0 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
2c800 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
2c810 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
2c820 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
2c830 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
2c840 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a  lementation it .
2c850 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
2c860 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
2c870 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
2c880 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
2c890 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a  eateFlag==3.  **
2c8a0 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
2c8b0 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
2c8c0 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
2c8d0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
2c8e0 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
2c8f0 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
2c900 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
2c910 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
2c920 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
2c930 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
2c940 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
2c950 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
2c960 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
2c970 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2c980 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2c990 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
2c9a0 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61  ITE_OK;.  testca
2c9b0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2c9c0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2c9d0 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  AG_ROLLBACK );. 
2c9e0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2c9f0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2ca00 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b  SPILLFLAG_OFF );
2ca10 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2ca20 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2ca30 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59  & SPILLFLAG_NOSY
2ca40 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  NC );.  if( pPag
2ca50 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20  er->doNotSpill. 
2ca60 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64    && ((pPager->d
2ca70 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49  oNotSpill & (SPI
2ca80 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c  LLFLAG_ROLLBACK|
2ca90 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21  SPILLFLAG_OFF))!
2caa0 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  =0.      || (pPg
2cab0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2cac0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20  NEED_SYNC)!=0). 
2cad0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2cae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2caf0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2cb00 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 5d  AGER_STAT_SPILL]
2cb10 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  ++;.  pPg->pDirt
2cb20 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2cb30 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2cb40 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2cb50 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2cb60 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2cb70 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2cb80 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2cb90 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
2cba0 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63  Pg); .    if( rc
2cbb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cbc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2cbd0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2cbe0 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2cbf0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2cc00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2cc10 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
2cc20 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28  IC_WRITE.    if(
2cc30 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2cc40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2cc50 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2cc60 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
2cc70 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
2cc80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2cc90 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2cca0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2ccb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
2ccc0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2ccd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2cce0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2ccf0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
2cd00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2cd10 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
2cd20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2cd30 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
2cd40 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2cd50 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2cd60 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
2cd70 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2cd80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cd90 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2cda0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cdb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2cdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cdd0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2cde0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2cdf0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2ce00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2ce10 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2ce20 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2ce30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2ce40 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2ce50 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2ce60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ce70 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2ce80 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2ce90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2cea0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2ceb0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2cec0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2ced0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2cee0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2cef0 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2cf00 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20  /*.** Flush all 
2cf10 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72  unreferenced dir
2cf20 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b  ty pages to disk
2cf30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cf40 50 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72  PagerFlush(Pager
2cf50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2cf60 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
2cf70 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45  rCode;.  if( !ME
2cf80 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
2cf90 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
2cfa0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
2cfb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2cfc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
2cfd0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2cfe0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
2cff0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2d000 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
2d010 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
2d020 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
2d030 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20  irty;.      if( 
2d040 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29  pList->nRef==0 )
2d050 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2d060 61 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64  agerStress((void
2d070 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29  *)pPager, pList)
2d080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d090 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
2d0a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2d0b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d0c0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2d0d0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2d0e0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2d0f0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2d100 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2d110 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2d120 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2d130 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2d140 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2d150 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2d160 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2d170 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2d180 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2d190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2d1a0 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2d1b0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2d1c0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2d1d0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2d1e0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2d1f0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2d200 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2d210 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2d220 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2d230 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2d240 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2d250 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2d260 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2d270 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2d280 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2d290 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2d2a0 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2d2b0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2d2c0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2d2d0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2d2e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2d2f0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2d300 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2d310 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2d320 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2d330 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2d340 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2d350 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2d360 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2d370 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2d380 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2d390 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2d3a0 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2d3b0 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61  .  When a new pa
2d3c0 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ge is allocated,
2d3d0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20   the.** first 8 
2d3e0 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 73 70  bytes of this sp
2d3f0 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62  ace are zeroed b
2d400 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  ut the remainder
2d410 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
2d420 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61  d..** (The extra
2d430 20 73 70 61 63 65 20 69 73 20 75 73 65 64 20 62   space is used b
2d440 79 20 62 74 72 65 65 20 61 73 20 74 68 65 20 4d  y btree as the M
2d450 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a  emPage object.).
2d460 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2d470 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2d480 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2d490 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2d4a0 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2d4b0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2d4c0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2d4d0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2d4e0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2d4f0 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2d500 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2d510 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2d520 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2d530 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2d540 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2d550 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2d560 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2d570 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2d580 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2d590 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2d5a0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2d5b0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2d5c0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2d5d0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2d5e0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2d5f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2d600 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2d610 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2d620 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2d630 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2d640 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2d650 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2d660 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2d670 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2d680 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2d690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d6a0 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2d6b0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2d6c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2d6d0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2d6e0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2d6f0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2d700 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2d710 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2d720 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2d730 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2d740 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2d750 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2d760 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2d770 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2d780 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2d790 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2d7a0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2d7b0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2d7c0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2d7d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d7e0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2d7f0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2d800 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2d810 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2d820 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2d830 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2d840 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2d850 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2d860 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2d870 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2d880 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2d890 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2d8a0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2d8b0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2d8c0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2d8d0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2d8e0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2d8f0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2d900 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2d910 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2d920 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2d930 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2d940 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2d950 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2d960 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d970 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2d980 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2d990 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2d9a0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2d9b0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2d9c0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2d9d0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2d9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d9f0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2da00 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2da10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2da20 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
2da30 5a 45 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d 20 3d  ZE.  int memJM =
2da40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2da50 20 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20   Memory journal 
2da60 6d 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 20  mode */.#else.# 
2da70 64 65 66 69 6e 65 20 6d 65 6d 4a 4d 20 30 0a 23  define memJM 0.#
2da80 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 61 64  endif.  int read
2da90 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2daa0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2dab0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2dac0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2dad0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2dae0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2daf0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2db00 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2db10 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2db20 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2db30 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2db40 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2db50 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2db60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2db70 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2db80 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2db90 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2dba0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2dbb0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2dbc0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2dbd0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2dbe0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2dbf0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2dc00 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2dc10 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2dc20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2dc30 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2dc40 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2dc50 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2dc60 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2dc70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2dc80 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2dc90 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2dca0 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2dcb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dcc0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2dcd0 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2dce0 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2dcf0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2dd00 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2dd10 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2dd20 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2dd30 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2dd40 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2dd50 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2dd60 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2dd70 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e  al).  */.  journ
2dd80 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2dd90 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2dda0 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a  alSize(pVfs));..
2ddb0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2ddc0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2ddd0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2dde0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2ddf0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2de00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2de10 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2de20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2de30 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2de40 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2de50 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2de60 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2de70 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2de80 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2de90 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2dea0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2deb0 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2dec0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2ded0 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74  BKPT;.      nPat
2dee0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2def0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2df00 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2df10 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2df20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2df30 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2df40 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2df50 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2df60 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2df70 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2df80 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2df90 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2dfa0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2dfb0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2dfc0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2dfd0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2dfe0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2dff0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2e000 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2e010 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2e020 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2e030 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2e040 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2e050 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2e060 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2e070 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2e080 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2e090 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2e0a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2e0b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2e0c0 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2e0d0 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2e0e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2e0f0 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2e100 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2e110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2e120 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2e130 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2e140 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2e150 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2e160 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e170 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2e180 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2e190 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2e1a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2e1b0 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2e1c0 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2e1d0 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2e1e0 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2e1f0 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2e200 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2e210 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2e220 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2e230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2e240 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2e250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e260 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2e270 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2e280 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2e290 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2e2a0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2e2b0 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2e2c0 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2e2d0 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2e2e0 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2e2f0 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2e300 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2e310 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2e320 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2e330 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2e340 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2e350 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2e360 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2e370 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2e380 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2e390 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2e3a0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2e3b0 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2e3c0 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2e3d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2e3e0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2e3f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2e400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e410 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e420 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2e430 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2e450 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2e460 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2e470 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2e480 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2e490 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2e4a0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2e4b0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e4c0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2e4d0 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2e4e0 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2e4f0 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2e500 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2e510 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e530 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2e540 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2e550 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e570 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2e580 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2e590 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2e5a0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2e5b0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2e5c0 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2e5d0 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2e5e0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2e5f0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2e600 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2e610 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2e620 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2e630 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2e640 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2e650 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2e660 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2e670 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2e680 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2e690 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2e6a0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2e6b0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2e6c0 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2e6d0 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2e6e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2e6f0 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2e700 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2e710 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2e720 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2e730 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2e740 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2e750 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2e760 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2e770 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2e780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2e790 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2e7a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2e7b0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2e7c0 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2e7d0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2e7e0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2e7f0 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2e800 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2e810 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2e820 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2e830 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2e840 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2e850 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2e860 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2e870 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2e880 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2e890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2e8a0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2e8b0 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2e8c0 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2e8d0 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2e8e0 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2e8f0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2e900 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2e910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e920 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  M_BKPT;.  }.  pP
2e930 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2e940 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2e950 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2e960 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2e970 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2e980 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2e990 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2e9a0 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2e9b0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2e9c0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2e9d0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2e9e0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2e9f0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2ea00 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2ea10 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2ea20 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2ea30 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2ea40 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2ea50 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2ea60 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2ea70 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2ea80 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2ea90 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2eaa0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2eab0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2eac0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2ead0 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2eae0 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2eaf0 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2eb00 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2eb10 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2eb20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2eb30 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2eb40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2eb50 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2eb60 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2eb70 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2eb80 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2eb90 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2eba0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2ebb0 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2ebc0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2ebd0 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2ebe0 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2ebf0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2ec00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2ec10 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2ec20 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2ec30 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2ec40 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2ec50 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2ec60 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2ec70 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2ec80 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2ec90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2eca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ecb0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2ecc0 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2ecd0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2ece0 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2ecf0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2ed00 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2ed10 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2ed20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2ed30 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2ed40 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2ed50 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2ed60 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2ed70 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2ed80 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2ed90 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2eda0 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2edb0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2edc0 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2edd0 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2ede0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2edf0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2ee00 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2ee10 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2ee20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2ee30 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2ee40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ee50 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2ee60 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2ee70 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2ee80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2ee90 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2eea0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2eeb0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2eec0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2eed0 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2eee0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2eef0 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
2ef00 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28 66 6f  .    memJM = (fo
2ef10 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ut&SQLITE_OPEN_M
2ef20 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
2ef30 66 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  f.    readOnly =
2ef40 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2ef50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 21 3d 30 3b  EN_READONLY)!=0;
2ef60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2ef70 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2ef80 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2ef90 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2efa0 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2efb0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2efc0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2efd0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2efe0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2eff0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2f000 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2f010 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2f020 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2f030 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2f040 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2f050 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2f060 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2f070 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2f080 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2f090 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2f0a0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2f0b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2f0c0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2f0d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2f0e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f0f0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2f100 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2f110 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2f120 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >fd);.      if( 
2f130 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2f140 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2f150 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2f160 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2f170 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2f180 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2f190 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2f1a0 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
2f1b0 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2f1c0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2f1d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f1e0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2f1f0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2f200 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2f210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2f220 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2f230 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2f240 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2f250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f260 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2f270 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2f280 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2f290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f2a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2f2b0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2f2c0 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
2f2d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2f2e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f2f0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2f300 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2f310 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2f320 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2f330 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2f340 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2f350 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2f360 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2f370 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2f380 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2f390 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2f3a0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2f3b0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2f3c0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2f3d0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2f3e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2f3f0 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50               szP
2f410 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2f420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f440 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
2f450 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2f460 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  oLock = sqlite3_
2f470 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2f480 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c  ename, "nolock",
2f490 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28   0);.      if( (
2f4a0 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
2f4b0 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30  AP_IMMUTABLE)!=0
2f4c0 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2f4d0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2f4e0 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74  Filename, "immut
2f4f0 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20  able", 0) ){.   
2f500 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20         vfsFlags 
2f510 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2f520 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
2f530 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65     goto act_like
2f540 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20  _temp_file;.    
2f550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2f560 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2f570 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2f580 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2f590 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2f5a0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2f5b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2f5c0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2f5d0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2f5e0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2f5f0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2f600 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2f610 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2f620 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2f630 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2f640 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2f650 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2f660 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2f670 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2f680 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2f690 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2f6a0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2f6b0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2f6c0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2f6d0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2f6e0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2f6f0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rnal..    **.   
2f700 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2f710 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69  also runs for fi
2f720 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d  les marked as im
2f730 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20  mutable..    */ 
2f740 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66  .act_like_temp_f
2f750 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c  ile:.    tempFil
2f760 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2f770 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2f780 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a  R_READER;     /*
2f790 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65   Pretend we alre
2f7a0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20  ady have a lock 
2f7b0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
2f7c0 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2f7d0 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65  _LOCK;    /* Pre
2f7e0 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45  tend we are in E
2f7f0 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f  XCLUSIVE mode */
2f800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  .    pPager->noL
2f810 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ock = 1;        
2f820 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2f830 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2f840 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2f850 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2f860 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2f870 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2f880 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2f890 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2f8a0 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2f8b0 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2f8c0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2f8d0 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2f8e0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2f8f0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2f900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f910 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2f920 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2f930 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2f940 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2f950 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2f960 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2f970 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2f980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2f990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2f9a0 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2f9b0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66   object. */.  if
2f9c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f9d0 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
2f9e0 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2f9f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
2fa00 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c  ra>=8 && nExtra<
2fa10 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  1000 );.    rc =
2fa20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2fa30 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2fa40 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa60 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2fa70 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2fa80 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2fa90 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2faa0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2fab0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ror occurred abo
2fac0 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61  ve, free the  Pa
2fad0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2fae0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2faf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2fb00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fb10 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2fb20 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2fb30 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2fb40 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
2fb50 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
2fb60 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2fb70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fb80 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2fb90 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2fba0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2fbb0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2fbc0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2fbd0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2fbe0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2fbf0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2fc00 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2fc10 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2fc20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2fc30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2fc40 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2fc50 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2fc60 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2fc70 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2fc80 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2fc90 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2fca0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2fcb0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2fcc0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fcd0 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2fce0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2fcf0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2fd00 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2fd10 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2fd20 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
2fd30 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2fd40 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2fd50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2fd60 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2fd70 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2fd80 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2fd90 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2fda0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2fdb0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2fdc0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2fdd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2fde0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2fdf0 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2fe00 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2fe10 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2fe20 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2fe30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2fe40 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2fe50 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2fe60 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2fe70 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2fe80 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2fe90 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2fea0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2feb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2fec0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2fed0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2fee0 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
2fef0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2ff00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ff10 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29  r->fullSync==0 )
2ff20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ff30 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d  ager->extraSync=
2ff40 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ff50 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2ff60 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2ff70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2ff80 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2ff90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2ffa0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2ffb0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2ffc0 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
2ffd0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2ffe0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2fff0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
30000 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
30010 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
30020 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51 4c 49  C_NORMAL | (SQLI
30030 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c  TE_SYNC_NORMAL<<
30040 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  2);.  }.  /* pPa
30050 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
30060 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
30070 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
30080 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
30090 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
300a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
300b0 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
300c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
300d0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
300e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
300f0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
30100 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
30110 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
30120 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
30130 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
30140 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
30150 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
30160 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
30170 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
30180 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
30190 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 7c 7c  lse if( memDb ||
301a0 20 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20 20 70 50   memJM ){.    pP
301b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
301c0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
301d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
301e0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
301f0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
30200 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
30210 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
30220 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
30230 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
30240 52 65 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74  Reinit;.  setGet
30250 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
30260 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  );.  /* memset(p
30270 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
30280 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
30290 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a  aHash)); */.  /*
302a0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
302b0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
302c0 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69  _MMAP_SIZE // wi
302d0 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72  ll be set by btr
302e0 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  ee.c */..  *ppPa
302f0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
30300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30310 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
30320 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30330 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
30340 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
30350 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
30360 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
30370 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
30380 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
30390 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
303a0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
303b0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
303c0 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
303d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
303e0 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
303f0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
30400 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
30410 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
30420 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
30430 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
30440 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
30450 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
30460 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
30470 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30480 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
30490 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
304a0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
304b0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
304c0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
304d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
304e0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
304f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
30500 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
30510 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
30520 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
30530 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
30540 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
30550 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
30560 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
30570 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
30580 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
30590 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
305a0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
305b0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
305c0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
305d0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
305e0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
305f0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
30600 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
30610 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
30620 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30630 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
30640 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
30650 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
30660 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
30670 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
30680 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
30690 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
306a0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
306b0 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
306c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
306d0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
306e0 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
306f0 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
30700 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
30710 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
30720 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
30730 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
30740 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
30750 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
30760 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
30770 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
30780 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
30790 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
307a0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
307b0 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
307c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
307d0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
307e0 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
307f0 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
30800 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
30810 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
30820 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
30830 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
30840 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
30850 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
30860 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
30870 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
30880 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
30890 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
308a0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
308b0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
308c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
308d0 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
308e0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
308f0 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
30900 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30910 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
30920 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
30930 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
30940 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
30950 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
30960 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
30970 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
30980 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
30990 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
309a0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
309b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
309c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
309d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
309e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
309f0 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
30a00 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
30a10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
30a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30a30 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
30a40 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
30a50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
30a60 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
30a70 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
30a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
30a90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
30aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30ab0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30ac0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
30ad0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
30ae0 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
30af0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
30b00 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
30b10 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
30b20 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
30b30 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
30b40 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
30b50 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
30b60 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
30b70 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
30b80 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30b90 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
30ba0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
30bb0 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
30bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30bd0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
30be0 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
30bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c00 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
30c10 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
30c20 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
30c30 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
30c40 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
30c50 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
30c60 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
30c70 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
30c80 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
30c90 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
30ca0 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
30cb0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
30cc0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
30cd0 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
30ce0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
30cf0 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
30d00 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
30d10 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
30d20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
30d30 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
30d40 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
30d50 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
30d60 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
30d70 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
30d80 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
30d90 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
30da0 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
30db0 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
30dc0 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
30dd0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
30de0 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
30df0 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
30e00 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
30e10 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
30e20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
30e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30e40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
30e50 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
30e60 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
30e70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30e80 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
30e90 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
30ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30eb0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30ec0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
30ed0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
30ee0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
30ef0 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  File==0 );.     
30f00 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
30f10 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
30f20 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30f40 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
30f50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a  he database is z
30f60 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a  ero pages in siz
30f70 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  e, that means th
30f80 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68  at either (1) th
30f90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
30fa0 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e  rnal is a remnan
30fb0 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64  t from a prior d
30fc0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
30fd0 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65   same name where
30fe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
30ff0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75  database file bu
31000 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  t not the journa
31010 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f  l was deleted, o
31020 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61  r (2) the initia
31030 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  l.        ** tra
31040 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f  nsaction that po
31050 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61  pulates a new da
31060 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20  tabase is being 
31070 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
31080 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65       ** In eithe
31090 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72  r case, the jour
310a0 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20  nal file can be 
310b0 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65  deleted.  Howeve
310c0 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20  r, take care.   
310d0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64       ** not to d
310e0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
310f0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
31100 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65  already open due
31110 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a   to.        ** j
31120 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
31130 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  IST..        */.
31140 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
31150 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65  e==0 && !jrnlOpe
31160 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
31170 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
31180 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31190 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
311a0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
311b0 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
311c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
311d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
311e0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
311f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
31200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31210 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
31220 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
31230 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
31240 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
31250 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31260 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
31270 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
31280 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
312a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
312b0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
312c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
312d0 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
312e0 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
312f0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
31300 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
31310 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
31320 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
31330 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
31340 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
31350 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
31360 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
31370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
31380 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
31390 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
313a0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
313b0 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
313c0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
313d0 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
313e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
313f0 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
31400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31410 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
31420 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
31430 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
31440 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
31450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31460 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
31470 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
31480 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
31490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
314a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
314b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
314c0 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
314d0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
314e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
314f0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
31500 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
31510 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
31520 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31530 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
31540 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
31550 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31560 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
31570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31580 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
31590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
315a0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
315b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
315c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
315d0 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
315e0 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
315f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
31600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
31610 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
31620 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
31630 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
31640 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
31650 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
31660 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
31670 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20      ** it has a 
31680 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
31690 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
316a0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
316b0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
316c0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
316d0 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
316e0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
316f0 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
31700 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
31710 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
31720 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
31730 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
31740 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
31750 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
31760 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
31770 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
31780 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
31790 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
317a0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
317b0 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
317c0 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
317d0 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
317e0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
317f0 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
31800 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
31810 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
31820 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
31830 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
31840 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
31850 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
31860 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31870 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
31880 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
318a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
318b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
318c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
318d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
318e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
318f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
31900 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
31910 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
31920 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
31930 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
31940 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20  agerGet() until 
31950 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
31960 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
31970 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
31980 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
31990 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
319a0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
319b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
319c0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
319d0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
319e0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
319f0 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
31a00 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
31a10 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
31a20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
31a30 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
31a40 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
31a50 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
31a60 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
31a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
31a80 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
31a90 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
31aa0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
31ab0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
31ac0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
31ad0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
31ae0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
31af0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
31b00 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
31b10 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
31b20 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
31b30 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
31b40 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
31b50 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
31b60 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
31b70 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
31b80 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
31b90 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
31ba0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
31bb0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
31bc0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
31bd0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
31be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31bf0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
31c00 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
31c10 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
31c20 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
31c30 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
31c40 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
31c50 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
31c60 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
31c70 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
31c80 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
31c90 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
31ca0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
31cb0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
31cc0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
31cd0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
31ce0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
31cf0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
31d00 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
31d10 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
31d20 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
31d30 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
31d40 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
31d50 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
31d60 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
31d70 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
31d80 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
31d90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
31da0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
31db0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
31dc0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
31dd0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
31de0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
31df0 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
31e00 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
31e10 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
31e20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
31e30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
31e40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
31e50 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
31e60 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
31e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e90 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
31ea0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
31eb0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
31ec0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
31ed0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
31ee0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
31ef0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
31f00 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
31f10 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
31f20 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
31f30 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
31f40 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
31f50 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
31f60 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
31f70 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
31f80 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
31f90 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73  s mode.  */.  as
31fa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
31fb0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
31fc0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
31fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
31fe0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
31ff0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
32000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32010 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32020 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
32030 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
32040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
32050 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
32060 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
32070 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
32080 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
32090 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
320a0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
320b0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
320c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
320d0 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
320e0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
320f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
32100 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
32110 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32120 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
32130 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
32140 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
32150 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
32160 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
32170 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
32180 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
32190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
321a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
321b0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
321c0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
321d0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
321e0 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
321f0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
32200 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
32210 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
32220 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
32230 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
32240 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
32250 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
32260 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
32270 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
32280 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
32290 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
322a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
322b0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
322c0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
322d0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
322e0 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
322f0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
32300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32310 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32320 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
32330 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
32340 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
32350 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
32360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
32370 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
32380 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32390 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
323a0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
323b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
323c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
323d0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
323e0 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
323f0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
32400 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
32410 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
32420 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
32430 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
32440 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
32450 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
32460 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
32470 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
32480 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
32490 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
324a0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
324b0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
324c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
324d0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
324e0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
324f0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
32500 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
32510 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
32520 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
32530 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
32540 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
32550 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
32560 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
32570 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
32580 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
32590 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
325a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
325b0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
325c0 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
325d0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
325e0 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
325f0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
32600 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
32610 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
32620 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
32630 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
32640 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
32650 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
32660 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
32670 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
32680 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
32690 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
326a0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
326b0 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
326c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
326d0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
326e0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
326f0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
32700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32710 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
32720 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
32730 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
32740 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
32750 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
32760 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
32770 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
32780 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
32790 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
327a0 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
327b0 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
327c0 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
327d0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
327e0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
327f0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
32800 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
32810 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
32820 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
32830 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
32840 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
32850 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
32860 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
32870 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
32880 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
32890 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
328a0 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
328b0 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
328c0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
328d0 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
328e0 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
328f0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
32900 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
32910 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
32920 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
32930 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
32940 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
32950 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
32960 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
32970 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
32980 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
32990 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
329a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
329b0 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
329c0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
329d0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
329e0 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
329f0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
32a00 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
32a10 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
32a20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32a30 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
32a40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32a50 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
32a60 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32a70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
32a80 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
32a90 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
32aa0 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
32ab0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
32ac0 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
32ad0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
32ae0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
32af0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
32b00 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
32b10 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
32b20 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
32b30 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
32b40 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
32b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
32b60 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
32b70 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
32b80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
32b90 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
32ba0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
32bb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
32bc0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
32bd0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
32be0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
32bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32c00 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
32c10 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32c20 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
32c30 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
32c40 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
32c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
32c60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32c70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
32c80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32c90 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
32ca0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
32cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32cc0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
32cd0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
32ce0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
32cf0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
32d00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32d20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
32d30 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
32d40 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
32d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
32d60 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
32d70 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
32d80 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
32d90 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
32da0 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
32db0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
32dc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
32dd0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
32de0 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
32df0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
32e00 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
32e10 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
32e20 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
32e30 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
32e40 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
32e50 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
32e60 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
32e70 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
32e80 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
32e90 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
32ea0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
32eb0 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
32ec0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
32ed0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
32ee0 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
32ef0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
32f00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
32f10 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32f20 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32f30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
32f40 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
32f50 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
32f60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32f80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
32f90 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
32fa0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
32fb0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  le);.          p
32fc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
32fd0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
32fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
32ff0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
33000 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
33010 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
33020 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
33030 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
33040 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
33050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33060 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
33070 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
33080 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
33090 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
330a0 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
330b0 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
330c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
330d0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
330e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
330f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
33100 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
33110 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
33120 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
33130 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
33140 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
33150 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
33160 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
33170 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
33180 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
33190 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
331a0 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
331b0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
331c0 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
331d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
331e0 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
331f0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
33200 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
33210 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
33220 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
33230 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
33240 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
33250 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
33260 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
33270 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
33280 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
33290 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
332a0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
332b0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
332c0 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
332d0 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
332e0 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
332f0 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
33300 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
33310 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
33320 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
33330 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
33340 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
33350 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
33360 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
33370 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
33380 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
33390 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
333a0 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
333b0 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
333c0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
333d0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
333e0 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
333f0 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
33400 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
33410 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
33420 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
33430 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
33440 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
33450 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
33460 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
33470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33480 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33490 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
334a0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
334b0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
334c0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
334d0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
334e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
334f0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
33500 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
33510 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
33520 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
33530 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e  File && pPager->
33540 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
33550 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  k ){.      /* Th
33560 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
33570 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
33580 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20  ired then check 
33590 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
335a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
335b0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
335c0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
335d0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
335e0 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
335f0 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  the cache.  The 
33600 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
33610 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  k flag prevents 
33620 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
33630 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20  ** occurring on 
33640 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61  the very first a
33650 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c  ccess to a file,
33660 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76   in order to sav
33670 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  e a.      ** sin
33680 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  gle unnecessary 
33690 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
336a0 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72  call at the star
336b0 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  t-up..      **. 
336c0 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
336d0 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74   changes are det
336e0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
336f0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
33700 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
33710 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
33720 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
33730 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
33740 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
33750 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
33760 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
33770 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
33780 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
33790 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
337a0 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
337b0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
337c0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
337d0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
337e0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
337f0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
33800 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
33810 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
33820 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
33830 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
33840 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
33850 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
33860 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
33870 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
33880 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
33890 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
338a0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
338b0 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
338c0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
338d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
338e0 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52 41  )];..      IOTRA
338f0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
33900 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
33910 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
33920 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
33930 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
33940 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
33950 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
33960 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
33970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
339a0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
339b0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  D ){.          g
339c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
339d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
339e0 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
339f0 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
33a00 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
33a10 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
33a20 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
33a30 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
33a40 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
33a50 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
33a60 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
33a70 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  (pPager);..     
33a80 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20     /* Unmap the 
33a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
33aa0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
33ab0 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63  at external proc
33ac0 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  esses.        **
33ad0 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61   may have trunca
33ae0 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ted the database
33af0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65   file and then e
33b00 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a  xtended it back.
33b10 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74          ** to it
33b20 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
33b30 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
33b40 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69  ss was not holdi
33b50 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  ng a lock..     
33b60 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
33b70 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69  se there may exi
33b80 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20  st a Pager.pMap 
33b90 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70  mapping that app
33ba0 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ears.        ** 
33bb0 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20  to be the right 
33bc0 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20  size but is not 
33bd0 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20  actually valid. 
33be0 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20  Avoid this.     
33bf0 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74     ** possibilit
33c00 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74  y by unmapping t
33c10 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20  he db here. */. 
33c20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45         if( USEFE
33c30 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20  TCH(pPager) ){. 
33c40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33c50 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
33c60 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
33c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33c80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
33c90 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
33ca0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
33cb0 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
33cc0 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
33cd0 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
33ce0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
33cf0 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
33d00 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
33d10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
33d20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
33d30 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
33d40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33d50 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
33d60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
33d70 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
33d80 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
33d90 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
33da0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33db0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
33dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
33dd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
33de0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
33df0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
33e00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
33e10 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61  mpFile==0 && pPa
33e20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33e30 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
33e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33e50 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
33e60 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
33e70 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
33e80 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
33e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33ea0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
33eb0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
33ec0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
33ed0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33ee0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33ef0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
33f00 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
33f10 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33f20 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
33f30 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
33f40 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  edLock = 1;.  }.
33f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33f60 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
33f70 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
33f80 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
33f90 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
33fa0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
33fb0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
33fc0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
33fd0 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
33fe0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
33ff0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
34000 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
34010 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
34020 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
34030 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
34040 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
34050 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
34060 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
34070 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
34080 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
34090 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
340a0 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
340b0 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  ger){.  if( sqli
340c0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
340d0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
340e0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
340f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  ert( pPager->nMm
34100 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a 20 62  apOut==0 ); /* b
34110 65 63 61 75 73 65 20 70 61 67 65 31 20 69 73 20  ecause page1 is 
34120 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70  never memory map
34130 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ped */.    pager
34140 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
34150 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
34160 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
34170 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73 20   getter methods 
34180 65 61 63 68 20 74 72 79 20 74 6f 20 61 63 71 75  each try to acqu
34190 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
341a0 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69 74  to a.** page wit
341b0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  h page number pg
341c0 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  no. If the reque
341d0 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
341e0 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
341f0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
34200 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
34210 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
34220 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
34230 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64 69 66  ** There are dif
34240 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  ferent implement
34250 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67 65  ations of the ge
34260 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70 65  tter method depe
34270 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  nding.** on the 
34280 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
34290 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
342a0 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f 72  *     getPageNor
342b0 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d 2d  mal()         --
342c0 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74    The normal get
342d0 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50 61  ter.**     getPa
342e0 67 65 45 72 72 6f 72 28 29 20 20 20 20 20 20 20  geError()       
342f0 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 74     --  Used if t
34300 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
34310 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  n error state.**
34320 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61 70       getPageMmap
34330 28 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  ()           -- 
34340 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d   Used if memory-
34350 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e  mapped I/O is en
34360 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74  abled.**.** If t
34370 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
34380 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
34390 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
343a0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
343b0 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
343c0 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
343d0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
343e0 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
343f0 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
34400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34410 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
34420 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
34430 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
34440 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
34450 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
34460 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
34470 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
34480 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
34490 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
344a0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
344b0 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
344c0 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
344d0 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
344e0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
344f0 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
34500 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
34510 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
34520 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
34530 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
34540 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
34550 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
34560 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
34570 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
34580 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
34590 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
345a0 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
345b0 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
345c0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
345d0 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
345e0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
345f0 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
34600 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70 61  .** the flags pa
34610 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
34620 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
34630 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e 64  OCONTENT bit and
34640 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
34650 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
34660 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
34670 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
34680 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
34690 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
346a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
346b0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
346c0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
346d0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
346e0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
346f0 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f  ** If PAGER_GET_
34700 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75  NOCONTENT is tru
34710 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
34720 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
34730 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
34740 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
34750 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
34760 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
34770 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
34780 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
34790 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
347a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
347b0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
347c0 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
347d0 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
347e0 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
347f0 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
34800 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
34810 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
34820 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
34830 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
34840 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
34850 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
34860 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
34870 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
34880 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
34890 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
348a0 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 0a   zeroed instead.
348b0 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ** of being read
348c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
348d0 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
348e0 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
348f0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
34900 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
34910 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
34920 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
34930 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
34940 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
34950 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
34960 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
34970 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
34980 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
34990 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
349a0 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
349b0 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
349c0 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
349d0 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
349e0 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
349f0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
34a00 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
34a10 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
34a20 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
34a30 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
34a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
34a50 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
34a60 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
34a70 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
34a80 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
34a90 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
34aa0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
34ab0 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
34ac0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
34ad0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
34ae0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
34af0 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
34b00 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
34b10 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
34b20 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
34b30 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
34b40 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
34b50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
34b60 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
34b70 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
34b80 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
34b90 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
34ba0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
34bb0 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
34bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
34bd0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
34be0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
34bf0 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
34c00 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
34c10 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
34c20 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
34c30 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
34c40 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
34c50 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
34c60 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
34c70 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
34c80 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
34c90 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61  al files..*/.sta
34ca0 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e  tic int getPageN
34cb0 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20 2a  ormal(.  Pager *
34cc0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
34cd0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
34ce0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34cf0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
34d00 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
34d10 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
34d20 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
34d30 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
34d40 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
34d50 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
34d60 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
34d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
34d80 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
34d90 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
34da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34db0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75 38  PgHdr *pPg;.  u8
34dc0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20   noContent;     
34dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34de0 20 54 72 75 65 20 69 66 20 50 41 47 45 52 5f 47   True if PAGER_G
34df0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
34e00 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  set */.  sqlite3
34e10 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42  _pcache_page *pB
34e20 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ase;..  assert( 
34e30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
34e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
34e50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34e60 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
34e70 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
34e80 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
34e90 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
34ea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34eb0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
34ec0 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  ock==1 );..  if(
34ed0 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72   pgno==0 ) retur
34ee0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34ef0 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d  _BKPT;.  pBase =
34f00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34f10 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34f20 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
34f30 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
34f40 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
34f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
34f60 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28  acheFetchStress(
34f70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34f80 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a   pgno, &pBase);.
34f90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34fa0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34fb0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34fc0 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
34fe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
34ff0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
35000 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35010 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20      }.  }.  pPg 
35020 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
35030 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
35040 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
35050 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
35060 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
35070 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a  g==(*ppPage) );.
35080 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35090 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
350a0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
350b0 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
350c0 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
350d0 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  .  noContent = (
350e0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
350f0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b  T_NOCONTENT)!=0;
35100 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
35110 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
35120 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
35130 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
35140 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
35150 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
35160 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
35170 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
35180 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
35190 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
351a0 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
351b0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
351c0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
351d0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
351e0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
351f0 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
35200 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
35210 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
35220 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
35230 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
35240 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
35250 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
35260 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
35270 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
35280 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65  But first some e
35290 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20  rror checks:.   
352a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54   **.    ** (1) T
352b0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
352c0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20  number is 2^31. 
352d0 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20     ** (2) Never 
352e0 74 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65  try to fetch the
352f0 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20   locking page.  
35300 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
35310 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
35320 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
35330 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
35340 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35350 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35360 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
35370 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
35390 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
353a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ;..    assert( !
353b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
353c0 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  d) || !MEMDB );.
353d0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
353e0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
353f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
35400 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
35410 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
35420 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
35430 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35440 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
35450 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
35460 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
35470 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35480 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
35490 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
354a0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
354b0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
354c0 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
354d0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
354e0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
354f0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
35500 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
35510 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
35520 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
35530 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
35540 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
35550 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
35560 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
35570 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
35580 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
35590 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
355a0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
355b0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
355c0 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
355d0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
355e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
355f0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
35600 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
35610 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
35620 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
35630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
35640 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
35650 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
35660 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35670 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
35680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35690 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
356a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
356b0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
356c0 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
356d0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
356e0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
356f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
35700 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
35710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35720 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
35730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35740 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
35750 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
35760 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
35770 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
35780 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
35790 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
357a0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
357b0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
357c0 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
357d0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
357e0 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b  ER_STAT_MISS]++;
357f0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
35800 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
35810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35830 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35840 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
35850 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
35860 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
35870 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
35890 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
358a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
358b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
358c0 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
358d0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
358e0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
358f0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
35900 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  ger);.  *ppPage 
35910 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
35920 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
35930 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
35940 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
35950 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f  er for when memo
35960 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
35970 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
35980 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
35990 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ap(.  Pager *pPa
359a0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
359b0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
359c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
359d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
359e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
359f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
35a00 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
35a10 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
35a20 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
35a30 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
35a40 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
35a50 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
35a60 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
35a70 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
35a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
35a90 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
35aa0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35ac0 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
35ad0 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
35ae0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
35af0 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
35b00 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
35b10 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
35b20 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
35b30 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
35b40 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
35b50 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
35b60 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
35b70 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
35b80 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
35b90 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
35ba0 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
35bb0 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
35bc0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
35bd0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
35be0 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
35bf0 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
35c00 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65  o>1.   && (pPage
35c10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35c20 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
35c30 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
35c40 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
35c50 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43   assert( USEFETC
35c60 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66  H(pPager) );.#if
35c70 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
35c80 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70  ODEC.  assert( p
35c90 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
35ca0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
35cb0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
35cc0 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
35cd0 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
35ce0 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
35cf0 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
35d00 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
35d10 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
35d20 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
35d30 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
35d40 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
35d50 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
35d60 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
35d70 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
35d80 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
35d90 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
35da0 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
35db0 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
35dc0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
35dd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35de0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
35df0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35e00 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
35e10 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
35e20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35e30 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
35e40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35e50 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
35e60 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
35e70 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35e80 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35e90 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
35ea0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
35eb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
35ec0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
35ed0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
35ee0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
35ef0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
35f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35f10 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
35f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35f40 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
35f50 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69  me==0 ){.    voi
35f60 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  d *pData = 0;.  
35f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35f80 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
35f90 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29  , .        (i64)
35fa0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
35fb0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
35fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
35fd0 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20  pData.    );.   
35fe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35ff0 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
36000 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36010 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
36020 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
36030 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
36040 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
36050 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
36060 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
36070 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
36080 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
36090 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
360a0 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
360b0 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
360c0 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
360d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
360e0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
360f0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
36100 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
36110 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
36120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36130 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
36140 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36150 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
36160 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
36170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
36190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
361a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
361b0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
361c0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
361d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
361e0 20 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e   return getPageN
361f0 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67  ormal(pPager, pg
36200 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
36210 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  s);.}.#endif /* 
36220 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
36230 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68  SIZE>0 */../* Th
36240 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65  e page getter me
36250 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68  thod for when th
36260 65 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72  e pager is an er
36270 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61  ror state */.sta
36280 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45  tic int getPageE
36290 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70  rror(.  Pager *p
362a0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
362b0 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
362c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
362d0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
362e0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
362f0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
36300 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
36310 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
36320 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
36330 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
36340 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
36350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
36360 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
36370 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
36380 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b  PARAMETER(pgno);
36390 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
363a0 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73  TER(flags);.  as
363b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
363c0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
363d0 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
363e0 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
363f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  er->errCode;.}..
36400 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c  ./* Dispatch all
36410 20 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75   page fetch requ
36420 65 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72  ests to the appr
36430 6f 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d  opriate getter m
36440 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ethod..*/.int sq
36450 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20  lite3PagerGet(. 
36460 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
36470 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
36480 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
36490 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
364a0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
364b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
364c0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
364d0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
364e0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
364f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
36500 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
36510 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
36520 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
36530 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
36540 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
36550 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  >xGet(pPager, pg
36560 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
36570 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  s);.}../*.** Acq
36580 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
36590 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
365a0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
365b0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
365c0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
365d0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
365e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
365f0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
36600 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
36610 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
36620 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
36630 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
36640 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
36650 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
36660 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
36670 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
36680 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
36690 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
366a0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
366b0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
366c0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
366d0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
366e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
366f0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
36700 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
36710 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
36720 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
36730 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
36740 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
36750 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
36760 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
36770 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
36780 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
36790 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  page *pPage;.  a
367a0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
367b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
367c0 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
367d0 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
367e0 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  he!=0 );.  pPage
367f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
36800 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
36810 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b  Cache, pgno, 0);
36820 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36830 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68  ==0 || pPager->h
36840 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
36850 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d   );.  if( pPage=
36860 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
36870 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
36880 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
36890 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
368a0 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
368b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
368c0 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
368d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  e..**.** The sql
368e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
368f0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
36900 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29 20  rUnrefNotNull() 
36910 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75  may only be.** u
36920 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20 74  sed if we know t
36930 68 61 74 20 74 68 65 20 70 61 67 65 20 62 65 69  hat the page bei
36940 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73 20 6e  ng released is n
36950 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  ot the last page
36960 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20 6c  ..** The btree l
36970 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c 64  ayer always hold
36980 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e 74  s page1 open unt
36990 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20 74  il the end, so t
369a0 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f  hese first.** to
369b0 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62 65   routines can be
369c0 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73 65   used to release
369d0 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72 20   any page other 
369e0 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70 50  than BtShared.pP
369f0 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  age1..**.** Use 
36a00 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36a10 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72 65  fPageOne() to re
36a20 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20 54 68  lease page1.  Th
36a30 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69 6e  is latter routin
36a40 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65 20  e.** checks the 
36a50 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
36a60 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
36a70 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75 6d  s and if the num
36a80 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20  ber of.** pages 
36a90 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74 20  reaches zero it 
36aa0 64 72 6f 70 73 20 74 68 65 20 64 61 74 61 62 61  drops the databa
36ab0 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  se lock..*/.void
36ac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36ad0 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
36ae0 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f 4e   *pPg){.  TESTON
36af0 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61 67 65  LY( Pager *pPage
36b00 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
36b10 20 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   ).  assert( pPg
36b20 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67  !=0 );.  if( pPg
36b30 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
36b40 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73 65  MMAP ){.    asse
36b50 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 31  rt( pPg->pgno!=1
36b60 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69 73   );  /* Page1 is
36b70 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61   never memory ma
36b80 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65  pped */.    page
36b90 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
36ba0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
36bb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36bc0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
36bd0 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73  }.  /* Do not us
36be0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
36bf0 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 61  o release the la
36c00 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
36c10 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65 72  page1 */.  asser
36c20 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
36c30 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
36c40 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 7d  >pPCache)>0 );.}
36c50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
36c60 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
36c70 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
36c80 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
36c90 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
36ca0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
36cb0 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65  agerUnrefPageOne
36cc0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
36cd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
36ce0 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
36cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
36d00 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  g->pgno==1 );.  
36d10 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
36d20 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
36d30 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65 31  )==0 ); /* Page1
36d40 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
36d50 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50 61   mapped */.  pPa
36d60 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36d70 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  r;.  sqlite3Page
36d80 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75  rResetLockTimeou
36d90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  t(pPager);.  sql
36da0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
36db0 65 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  e(pPg);.  pagerU
36dc0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
36dd0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
36de0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
36df0 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
36e00 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
36e10 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
36e20 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
36e30 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
36e40 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
36e50 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
36e60 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
36e70 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
36e80 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
36e90 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
36ea0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
36eb0 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
36ec0 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
36ed0 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
36ee0 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
36ef0 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
36f00 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
36f10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36f20 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
36f30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
36f40 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
36f50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
36f60 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
36f70 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
36f80 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
36f90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
36fa0 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
36fb0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
36fc0 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
36fd0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
36fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
36ff0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
37000 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
37010 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
37020 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
37030 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
37040 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
37050 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
37060 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
37070 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
37080 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
37090 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
370a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
370b0 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
370c0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
370d0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
370e0 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
370f0 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
37100 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
37110 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
37120 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
37130 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
37140 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
37150 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
37160 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
37170 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
37180 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
37190 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
371a0 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
371b0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
371c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
371d0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
371e0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
371f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
37200 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
37210 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
37220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37230 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
37240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
37250 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
37260 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
37270 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
37280 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
37290 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
372a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
372b0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
372c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
372d0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
372e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
372f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
37300 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
37310 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
37320 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
37330 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
37340 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
37350 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
37360 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
37370 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
37380 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
37390 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
373a0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
373b0 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
373c0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
373d0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
373e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
373f0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
37400 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
37410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37420 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37430 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
37440 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37450 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
37460 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
37470 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
37480 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37490 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
374a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
374b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
374c0 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
374d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
374e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
374f0 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
37500 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
37510 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
37520 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37530 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
37540 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
37550 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
37560 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
37570 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
37580 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
37590 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  {.        int fl
375a0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
375b0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
375c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
375d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69          int nSpi
375e0 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ll;..        if(
375f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
37600 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  e ){.          f
37610 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
37620 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
37630 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
37640 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  EMP_JOURNAL);.  
37650 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
37660 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
37670 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20  StmtSpill;.     
37680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37690 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
376a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
376b0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
376c0 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75   nSpill = jrnlBu
376d0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
376e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
376f0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
37700 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
37710 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
37720 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
37730 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
37740 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
37750 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
37760 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
37770 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
37780 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
37790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
377a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
377b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
377c0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
377d0 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
377e0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
377f0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
37800 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70  >jfd, flags, nSp
37810 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ill.          );
37820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37830 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
37840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
37850 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
37860 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
37870 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
37880 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
37890 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
378a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
378b0 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
378c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
378d0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
378e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
378f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37900 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
37910 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
37920 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
37930 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
37940 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
37950 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37960 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
37970 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
37980 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
37990 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
379a0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
379b0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
379c0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
379d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
379e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
379f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
37a00 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
37a10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
37a20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
37a30 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
37a40 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
37a50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37a60 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37a70 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
37a80 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
37a90 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37aa0 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
37ab0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
37ac0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
37ad0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
37ae0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
37af0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
37b00 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37b10 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
37b20 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
37b30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
37b40 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
37b50 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
37b60 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
37b70 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
37b80 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
37b90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
37ba0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
37bb0 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
37bc0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37bd0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
37be0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
37bf0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
37c00 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
37c10 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
37c20 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
37c30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
37c40 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
37c50 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
37c60 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
37c70 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
37c80 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
37c90 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
37ca0 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
37cb0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
37cc0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
37cd0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
37ce0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
37cf0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
37d00 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
37d10 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
37d20 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
37d30 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
37d40 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
37d50 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
37d60 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
37d70 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
37d80 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
37d90 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
37da0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
37db0 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
37dc0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
37dd0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
37de0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
37df0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
37e00 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
37e10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37e20 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
37e30 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
37e40 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
37e50 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
37e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
37e70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
37e80 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
37e90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37ea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37eb0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
37ec0 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
37ed0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
37ee0 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
37ef0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
37f00 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
37f10 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
37f20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
37f30 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
37f40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
37f50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37f60 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
37f70 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37f80 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
37f90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
37fa0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
37fb0 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
37fc0 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
37fd0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
37fe0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
37ff0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
38000 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
38010 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
38020 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
38030 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
38040 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
38050 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
38060 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
38070 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
38080 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
38090 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
380a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
380b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
380c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
380d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
380e0 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69    }.        (voi
380f0 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  d)sqlite3WalExcl
38100 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
38110 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20  ->pWal, 1);.    
38120 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72    }..      /* Gr
38130 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ab the write loc
38140 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  k on the log fil
38150 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
38160 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20  , upgrade to.   
38170 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45     ** PAGER_RESE
38180 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65  RVED state. Othe
38190 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
381a0 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
381b0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
381c0 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e   ** The busy-han
381d0 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f  dler is not invo
381e0 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63  ked if another c
381f0 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64  onnection alread
38200 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73  y.      ** holds
38210 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e   the write-lock.
38220 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
38230 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
38240 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20  ll call it..    
38250 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
38260 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
38270 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
38280 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
38290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
382a0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
382b0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
382c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
382d0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
382e0 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
382f0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
38300 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
38310 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
38320 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
38330 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
38340 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
38350 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
38360 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
38370 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
38380 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
38390 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
383a0 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
383b0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
383c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
383d0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
383e0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
383f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38400 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20  TE_OK && exFlag 
38410 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38420 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
38430 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
38440 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
38450 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
38460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38470 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61   ){.      /* Cha
38480 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f  nge to WRITER_LO
38490 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20  CKED state..    
384a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41    **.      ** WA
384b0 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65  L mode sets Page
384c0 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45  r.eState to PAGE
384d0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
384e0 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  or CACHEMOD.    
384f0 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73    ** when it has
38500 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
38510 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20  tion, but never 
38520 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49  to DBMOD or FINI
38530 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54  SHED..      ** T
38540 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
38550 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74  n those states t
38560 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20  he code to roll 
38570 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a  back savepoint .
38580 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
38590 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64  tions may copy d
385a0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ata from the sub
385b0 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68  -journal into th
385c0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
385d0 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c    ** file as wel
385e0 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61  l as into the pa
385f0 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20  ge cache. Which 
38600 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65  would be incorre
38610 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ct in .      ** 
38620 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  WAL mode..      
38630 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
38640 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
38650 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20  WRITER_LOCKED;. 
38660 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48       pPager->dbH
38670 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
38680 2d 3e