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

Artifact a0d8f686ef64549ad5b356fd30429bd9ee7a06dd42b4d6faa096352ff26b1c5b:


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 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
97b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97c0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97d0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97e0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97f0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9800: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
9810: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9820: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9850: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9860: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9870: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9890: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
98a0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
98b0: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98c0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9900: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
9910: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9920: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9930: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9940: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9960: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9970: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9980: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9990: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
99a0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
99b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99c0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99d0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99e0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99f0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9a00: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
9a10: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a20: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a30: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a40: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a50: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a60: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a70: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a80: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a90: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9ab0: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9ac0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ad0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ae0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9af0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9b00: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9b10: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b20: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b30: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b40: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b50: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b60: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b70: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b80: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9ba0: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9bb0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9bc0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bd0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9be0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bf0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9c00: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9c10: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c20: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c30: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c40: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c50: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c60: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c70: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c80: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c90: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9ca0: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9cb0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9cc0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cd0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9ce0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9d00: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9d10: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d20: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d30: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d40: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d50: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d70: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d80: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9dc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9dd0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9de0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9df0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9e00: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9e10: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e30: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e50: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e70: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e80: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e90: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9ea0: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9eb0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ec0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9ed0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ee0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9f00: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9f10: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f20: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f30: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f40: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f50: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f60: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f70: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f80: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f90: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9fb0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fc0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fd0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fe0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9ff0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
a000: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
a010: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a030: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a050: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a060: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a070: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a080: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a090: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a0a0: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a0b0: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0c0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0e0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a100: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a110: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a120: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a130: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a140: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a150: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a160: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a170: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a180: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a190: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a1a0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a1b0: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1c0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1d0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1e0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1f0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a200: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a210: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a220: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a230: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a260: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a270: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a280: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a2a0: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a2b0: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2c0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2d0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a300: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a310: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a340: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a350: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a360: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a370: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a380: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a3b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3d0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3f0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a400: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a410: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a420: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a430: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a440: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a450: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a480: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a490: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a4a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4f0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a500: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a510: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a520: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a530: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a540: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a550: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a560: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a570: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a590: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a5a0: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a5b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5c0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5d0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5f0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a610: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a620: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a630: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a640: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a650: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a660: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a680: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a690: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a6b0: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6c0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6d0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6e0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6f0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a700: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a710: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a720: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a730: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a740: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a760: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a780: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a790: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a7a0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a7b0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7c0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a800: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a820: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a830: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a840: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a860: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a870: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a880: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a890: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a8a0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a8b0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8c0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a900: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a910: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a920: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a940: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a950: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a960: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a970: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9a0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a9b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9e0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9f0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa00: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aa10: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa30: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa50: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa60: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa70: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa80: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa90: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aaa0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aab0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aac0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aaf0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab00: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
ab10: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab30: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab40: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aba0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
abb0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
abc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abd0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abe0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abf0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
ac10: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac20: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac30: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac40: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac50: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac60: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac70: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac80: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac90: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
aca0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
acb0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
acc0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acd0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ace0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acf0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ad10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad20: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad30: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad50: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad60: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ada0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
adb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
adc0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
add0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ade0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
adf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae00: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
ae10: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae20: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae30: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae40: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae50: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae70: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae80: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae90: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
aea0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
aeb0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aec0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aed0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
aee0: 6e 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20  ne has external 
aef0: 6c 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72  linkage in order
af00: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
af10: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a  piler warnings.*
af20: 2a 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65  * about an unuse
af30: 64 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  d function.  It 
af40: 69 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68  is enclosed with
af50: 69 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  in SQLITE_DEBUG 
af60: 61 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e  and so does.** n
af70: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
af80: 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63  mal builds..*/.c
af90: 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72  har *print_pager
afa0: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
afb0: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
afc0: 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73  zRet[1024];..  s
afd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
afe0: 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20  1024, zRet,.    
aff0: 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20    "Filename:    
b000: 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53    %s\n".      "S
b010: 74 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73  tate:         %s
b020: 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20   errCode=%d\n". 
b030: 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20       "Lock:     
b040: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
b050: 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20   "Locking mode: 
b060: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73   locking_mode=%s
b070: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b080: 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61  al mode:  journa
b090: 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  l_mode=%s\n".   
b0a0: 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72     "Backing stor
b0b0: 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d  e: tempFile=%d m
b0c0: 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e  emDb=%d useJourn
b0d0: 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22  al=%d\n".      "
b0e0: 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a  Journal:       j
b0f0: 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a  ournalOff=%lld j
b100: 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e  ournalHdr=%lld\n
b110: 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20  ".      "Size:  
b120: 20 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25          dbsize=%
b130: 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20  d dbOrigSize=%d 
b140: 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22  dbFileSize=%d\n"
b150: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c  .      , p->zFil
b160: 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d  ename.      , p-
b170: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
b180: 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f  PEN            ?
b190: 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20   "OPEN" :.      
b1a0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
b1b0: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
b1c0: 20 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a     ? "READER" :.
b1d0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
b1e0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
b1f0: 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54  LOCKED   ? "WRIT
b200: 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20  ER_LOCKED" :.   
b210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
b220: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
b230: 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f  HEMOD ? "WRITER_
b240: 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20  CACHEMOD" :.    
b250: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b260: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
b270: 44 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44  D    ? "WRITER_D
b280: 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  BMOD" :.        
b290: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b2a0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
b2b0: 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53   ? "WRITER_FINIS
b2c0: 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  HED" :.        p
b2d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b2e0: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
b2f0: 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72  ? "ERROR" : "?er
b300: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b310: 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20  nt)p->errCode.  
b320: 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d      , p->eLock==
b330: 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20  NO_LOCK         
b340: 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20  ? "NO_LOCK" :.  
b350: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b360: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
b370: 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20  ? "RESERVED" :. 
b380: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b390: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
b3a0: 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a   ? "EXCLUSIVE" :
b3b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
b3c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  k==SHARED_LOCK  
b3d0: 20 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a     ? "SHARED" :.
b3e0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b3f0: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20  ==UNKNOWN_LOCK  
b400: 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20    ? "UNKNOWN" : 
b410: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b420: 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  , p->exclusiveMo
b430: 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22  de ? "exclusive"
b440: 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20   : "normal".    
b450: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f    , p->journalMo
b460: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b470: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f  LMODE_MEMORY   ?
b480: 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20   "memory" :.    
b490: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b4a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b4b0: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f  LMODE_OFF      ?
b4c0: 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20   "off" :.       
b4d0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b4e0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b4f0: 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64  DE_DELETE   ? "d
b500: 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20  elete" :.       
b510: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b520: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b530: 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70  DE_PERSIST  ? "p
b540: 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20  ersist" :.      
b550: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b560: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b570: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22  ODE_TRUNCATE ? "
b580: 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20  truncate" :.    
b590: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b5a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b5b0: 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f  LMODE_WAL      ?
b5c0: 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72   "wal" : "?error
b5d0: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
b5e0: 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e  p->tempFile, (in
b5f0: 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74  t)p->memDb, (int
b600: 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  )p->useJournal. 
b610: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
b620: 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c  lOff, p->journal
b630: 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  Hdr.      , (int
b640: 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74  )p->dbSize, (int
b650: 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20  )p->dbOrigSize, 
b660: 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69  (int)p->dbFileSi
b670: 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  ze.  );..  retur
b680: 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
b690: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
b6a0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76  erences to the v
b6b0: 61 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74  arious page gett
b6c0: 65 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ers */.static in
b6d0: 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  t getPageNormal(
b6e0: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b6f0: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69  ge**,int);.stati
b700: 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72  c int getPageErr
b710: 6f 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  or(Pager*,Pgno,D
b720: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69  bPage**,int);.#i
b730: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
b740: 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
b750: 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28  int getPageMMap(
b760: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b770: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69  ge**,int);.#endi
b780: 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  f../*.** Set the
b790: 20 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68   Pager.xGet meth
b7a0: 6f 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f  od for the appro
b7b0: 70 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75  priate routine u
b7c0: 73 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20  sed to fetch.** 
b7d0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
b7e0: 20 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   pager..*/.stati
b7f0: 63 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72  c void setGetter
b800: 4d 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50  Method(Pager *pP
b810: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
b820: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b830: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b840: 20 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b   = getPageError;
b850: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b860: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65  MMAP_SIZE>0.  }e
b870: 6c 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48  lse if( USEFETCH
b880: 28 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20  (pPager).#ifdef 
b890: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
b8a0: 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78  .   && pPager->x
b8b0: 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a  Codec==0.#endif.
b8c0: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
b8d0: 3e 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d  >xGet = getPageM
b8e0: 4d 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  Map;.#endif /* S
b8f0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
b900: 49 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65  IZE>0 */.  }else
b910: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47  {.    pPager->xG
b920: 65 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d  et = getPageNorm
b930: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
b940: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b950: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
b960: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
b970: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
b980: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
b990: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
b9a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
b9b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
b9c0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
b9d0: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
b9e0: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
b9f0: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ba00: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
ba10: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
ba20: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
ba30: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
ba40: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
ba50: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
ba60: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
ba70: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
ba80: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
ba90: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
baa0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
bab0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
bac0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
bad0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
bae0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
baf0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
bb00: 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   *p;.  Pgno pgno
bb10: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
bb20: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
bb30: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
bb40: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
bb50: 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61    p = &pPager->a
bb60: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
bb70: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
bb80: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
bb90: 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
bba0: 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  ull(p->pInSavepo
bbb0: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
bbc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bbd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bbe0: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
bbf0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
bc00: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
bc10: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
bc20: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
bc30: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
bc40: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
bc50: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
bc60: 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
bc70: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bc80: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
bc90: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
bca0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65  pPg->pgno);.}.#e
bcb0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
bcc0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
bcd0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
bce0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bcf0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
bd00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
bd10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
bd20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bd30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
bd40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
bd50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
bd60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
bd70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
bd80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
bd90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
bda0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
bdb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
bdc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bdd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bde0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
bdf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
be00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
be10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
be20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
be30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
be40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
be50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
be60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
be70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
be80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
be90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
bea0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
beb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
bec0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
bed0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
bee0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
bef0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
bf00: 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ,B).../*.** Writ
bf10: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
bf20: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
bf30: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
bf40: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
bf50: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
bf60: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
bf70: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
bf80: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
bf90: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
bfa0: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
bfb0: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
bfc0: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
bfd0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
bfe0: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
bff0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
c000: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
c010: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
c020: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
c030: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c040: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
c050: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
c060: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a  ither NO_LOCK.**
c070: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
c080: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
c090: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c0a0: 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  e call to xUnloc
c0b0: 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c  k().** succeeds,
c0c0: 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
c0d0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
c0e0: 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65   match the (atte
c0f0: 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e  mpted) new lock.
c100: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c110: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c120: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c130: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c140: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
c150: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
c160: 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20  ify it. See the 
c170: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c180: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a  e #define of .**
c190: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c1a0: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c1b0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c1c0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c  tic int pagerUnl
c1d0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
c1e0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
c1f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c200: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
c210: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c220: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
c230: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b  er->eLock==eLock
c240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
c250: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
c260: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c270: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c280: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c290: 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
c2a0: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ager)==0 );.  if
c2b0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c2c0: 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
c2d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
c2e0: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k>=eLock );.    
c2f0: 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  rc = pPager->noL
c300: 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ock ? SQLITE_OK 
c310: 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  : sqlite3OsUnloc
c320: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
c330: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
c340: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
c350: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c360: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c370: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c380: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
c390: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
c3a0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
c3b0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
c3c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
c3d0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
c3e0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
c3f0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
c400: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
c410: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
c420: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
c430: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
c440: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
c450: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
c460: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
c470: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
c480: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
c490: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
c4a0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
c4b0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
c4c0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
c4d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
c4e0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
c4f0: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
c500: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
c510: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
c520: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
c530: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
c540: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
c550: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
c560: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
c570: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
c580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c590: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
c5a0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
c5b0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
c5c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
c5d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
c5e0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
c5f0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
c600: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
c610: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
c620: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
c630: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
c640: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
c650: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
c660: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c670: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c680: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
c690: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
c6a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c6b0: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
c6c0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c6d0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
c6e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
c6f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
c700: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
c710: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
c720: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
c730: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
c740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c750: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c760: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
c770: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
c780: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
c790: 6d 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20  mic-write or.** 
c7a0: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
c7b0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  te optimizations
c7c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
c7d0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
c7e0: 65 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74  e.** atomic-writ
c7f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c800: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
c810: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
c820: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c830: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c840: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
c850: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
c860: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
c870: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
c880: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
c890: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
c8a0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c8b0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
c8c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
c8d0: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
c8e0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
c8f0: 2a 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  ** If it can be 
c900: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76  used, then the v
c910: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c920: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c930: 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
c940: 65 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69  e when it contai
c950: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
c960: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
c970: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
c980: 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72   atomic-batch-wr
c990: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
c9a0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
c9b0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c9c0: 72 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74  ristics().** ret
c9d0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74  urns a value wit
c9e0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  h the SQLITE_IOC
c9f0: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
ca00: 62 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a  bit set. -1 is.*
ca10: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
ca20: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
ca30: 66 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69  f neither optimi
ca40: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ca50: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
ca60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ca70: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
ca80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ca90: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
caa0: 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   );..#if defined
cab0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
cac0: 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20  TOMIC_WRITE) \. 
cad0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
cae0: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
caf0: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69  TOMIC_WRITE).  i
cb00: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
cb30: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20  cteristics */.. 
cb40: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
cb50: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
cb60: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
cb70: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
cb80: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
cb90: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
cba0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
cbb0: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  r);.#endif..#ifd
cbc0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cbd0: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
cbe0: 49 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72  ITE.  if( pPager
cbf0: 2d 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64  ->dbSize>0 && (d
cc00: 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  c&SQLITE_IOCAP_B
cc10: 41 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a  ATCH_ATOMIC) ){.
cc20: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
cc30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
cc40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cc50: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b  ATOMIC_WRITE.  {
cc60: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
cc70: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
cc80: 72 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  rSize;.    int s
cc90: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
cca0: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
ccb0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
ccc0: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
ccd0: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
cce0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
ccf0: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
cd00: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
cd10: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
cd20: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
cd30: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
cd40: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
cd50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cd60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
cd70: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
cd80: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
cd90: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
cda0: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  r);.#endif..  re
cdb0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cdc0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
cdd0: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
cde0: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
cdf0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
ce00: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
ce10: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
ce20: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
ce30: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
ce40: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
ce50: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
ce60: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
ce70: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
ce80: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
ce90: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
cea0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
ceb0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
cec0: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
ced0: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
cee0: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
cef0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
cf00: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
cf10: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
cf20: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
cf30: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
cf40: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
cf50: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
cf60: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
cf70: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
cf80: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
cf90: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
cfa0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cfb0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
cfc0: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
cfd0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
cfe0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
cff0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
d000: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
d010: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
d020: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
d030: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
d040: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
d050: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
d060: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
d070: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
d080: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
d090: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
d0a0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
d0b0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
d0c0: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
d0d0: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
d0e0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
d0f0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
d100: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
d110: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
d120: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
d130: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
d140: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
d150: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
d160: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
d170: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
d180: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
d190: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
d1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
d1b0: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
d1c0: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
d1d0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
d1e0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
d1f0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
d200: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
d210: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
d220: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
d230: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
d240: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
d250: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
d260: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
d270: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
d280: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
d290: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
d2a0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
d2b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
d2c0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
d2d0: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
d2e0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
d2f0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
d300: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d310: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
d320: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
d330: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
d340: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
d350: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
d360: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
d370: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
d380: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
d390: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
d3a0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
d3b0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
d3c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d3d0: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
d3e0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
d3f0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
d400: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
d410: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
d420: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
d430: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
d440: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
d450: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
d460: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
d470: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
d480: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
d490: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
d4a0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
d4b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
d4c0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
d4d0: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
d4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
d4f0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
d500: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
d510: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
d520: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
d530: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
d540: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
d550: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
d560: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
d570: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
d580: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
d590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d5a0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
d5b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
d5c0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
d5d0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
d5e0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
d5f0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
d600: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
d610: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
d620: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
d630: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
d640: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
d650: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d660: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
d670: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
d680: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
d690: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d6a0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
d6b0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
d6c0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
d6d0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
d6e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d6f0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
d700: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
d710: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
d720: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
d730: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d750: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
d760: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
d770: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
d780: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
d790: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d7c0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
d7f0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
d800: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
d810: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
d820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
d830: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
d840: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
d850: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
d860: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d870: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
d880: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
d890: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
d8a0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8c0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
d8d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
d8e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
d8f0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
d900: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
d910: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
d920: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
d930: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d940: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d950: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d960: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
d970: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
d980: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d990: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d9a0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
d9b0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
d9c0: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73  ter .   || len>s
d9d0: 7a 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d  zJ-16.   || len=
d9e0: 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  =0 .   || SQLITE
d9f0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
da00: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
da10: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
da20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
da30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
da40: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
da50: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
da60: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
da70: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
da80: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
da90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
daa0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
dab0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
dac0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
dad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
dae0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
daf0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
db00: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
db10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
db20: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
db30: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
db40: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
db50: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
db60: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
db70: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
db80: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
db90: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
dba0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
dbb0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
dbc0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
dbd0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
dbe0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
dbf0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
dc00: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
dc10: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
dc20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
dc30: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
dc40: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
dc50: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
dc60: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
dc70: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
dc80: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
dc90: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
dca0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dcb0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
dcc0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
dcd0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
dce0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
dcf0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
dd00: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
dd10: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
dd20: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
dd30: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
dd40: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
dd50: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
dd60: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
dd70: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
dd80: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
dd90: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
dda0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
ddb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddd0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
de40: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
de50: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
de60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
de70: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
de80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
de90: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
dea0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
deb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
dec0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
ded0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
dee0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
def0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
df00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
df10: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
df20: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
df30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
df40: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
df50: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
df60: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
df70: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
df80: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
df90: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
dfa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
dfb0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
dfc0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
dfd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
dfe0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
dff0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
e000: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
e010: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
e020: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
e030: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
e040: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
e050: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
e060: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
e070: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
e080: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
e090: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
e0a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
e0b0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
e0c0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
e0d0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
e0e0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
e0f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
e100: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
e110: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
e120: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
e130: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e140: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
e150: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
e160: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
e170: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
e180: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
e190: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
e1a0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
e1b0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
e1c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
e1d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
e1e0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
e1f0: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
e200: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
e210: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
e220: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
e230: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
e240: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
e250: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
e260: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
e270: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
e280: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
e290: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
e2a0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
e2b0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
e2c0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
e2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
e2e0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
e2f0: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
e300: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
e310: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
e320: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e330: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
e340: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
e350: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
e360: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
e370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e380: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
e390: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
e3a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
e3b0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
e3c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e3d0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e400: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
e410: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e420: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
e430: 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c   !sqlite3Journal
e440: 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
e450: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
e460: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e470: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
e480: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
e490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
e4a0: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
e4b0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
e4c0: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
e4d0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
e4e0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
e4f0: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
e500: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
e510: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e520: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e530: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
e540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
e550: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e560: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
e570: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
e580: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
e590: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
e5a0: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
e5b0: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
e5c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e5d0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
e5e0: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
e5f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
e600: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
e610: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
e620: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
e630: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
e640: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e650: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
e660: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
e670: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
e680: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
e690: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
e6a0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
e6b0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
e6c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
e6d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
e6e0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
e6f0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
e700: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
e710: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
e720: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
e730: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
e740: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
e750: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
e760: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
e770: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
e780: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
e790: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
e7a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e7b0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
e7c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
e7d0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
e7e0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
e7f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
e800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
e810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
e820: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
e830: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e840: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
e850: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
e860: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e870: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
e890: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e8a0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
e8b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e8c0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e8d0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e8e0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e8f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e900: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e910: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e920: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e930: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e940: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e950: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e960: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e970: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e980: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e990: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e9a0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e9b0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e9c0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e9d0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e9e0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e9f0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
ea00: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
ea10: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
ea20: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
ea30: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
ea40: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
ea50: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
ea60: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
ea70: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
ea80: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
ea90: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
eaa0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
eab0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
eac0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
ead0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
eae0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
eaf0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
eb00: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
eb10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
eb40: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
eb50: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
eb60: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
eb70: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
eb80: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
eb90: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
eba0: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
ebb0: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
ebc0: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
ebd0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
ebe0: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
ebf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ec00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
ec10: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
ec20: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
ec30: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ec60: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
ec70: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
ec80: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
ec90: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
eca0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
ecb0: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
ecc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ecd0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
ece0: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
ecf0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
ed00: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
ed10: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
ed20: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
ed30: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
ed40: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
ed50: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ed60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ed70: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
ed80: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
ed90: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
eda0: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
edb0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
edc0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
edd0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
ede0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
edf0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
ee00: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
ee10: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ee20: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
ee30: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
ee40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
ee50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
ee60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ee70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
ee80: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
ee90: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
eea0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
eeb0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
eec0: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
eed0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
eee0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
eef0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
ef00: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
ef10: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
ef20: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
ef30: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
ef40: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
ef50: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
ef60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
ef70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
ef80: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
ef90: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
efa0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
efb0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
efc0: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
efd0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
efe0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
eff0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
f000: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
f010: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
f020: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
f030: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
f040: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
f050: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
f060: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
f070: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
f080: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
f090: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
f0a0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
f0b0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
f0c0: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
f0d0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
f0e0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
f0f0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
f100: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
f110: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
f120: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
f130: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
f140: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
f150: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
f160: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
f170: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
f180: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
f190: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
f1a0: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
f1b0: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
f1c0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
f1d0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
f1e0: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
f1f0: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
f200: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
f210: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
f220: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
f230: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
f240: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
f250: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
f260: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
f270: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
f280: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
f290: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f2a0: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
f2b0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
f2c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
f2d0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
f2e0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
f2f0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
f300: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
f310: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f320: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
f330: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
f340: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
f350: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
f360: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
f370: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
f380: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f390: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
f3a0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f3b0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f3c0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
f3d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
f3e0: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
f3f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f400: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
f410: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
f420: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
f430: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
f440: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f450: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
f460: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
f470: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f480: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f490: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f4a0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
f4b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f4c0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
f4d0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
f4e0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f4f0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f500: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
f510: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
f520: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
f530: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
f540: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
f550: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
f560: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f570: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f580: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
f590: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
f5a0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
f5b0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
f5c0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f5d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f5e0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
f5f0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
f600: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
f610: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
f620: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
f630: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
f640: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
f650: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
f660: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
f670: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
f680: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
f690: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
f6a0: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
f6b0: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
f6c0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
f6d0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
f6e0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
f6f0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
f700: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f710: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
f720: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
f730: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
f740: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
f750: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
f760: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
f770: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
f780: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
f790: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
f7a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
f7b0: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
f7c0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
f7d0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
f7e0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
f7f0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
f800: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
f810: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
f820: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
f830: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
f840: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
f850: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
f860: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
f870: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
f880: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
f890: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
f8a0: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
f8b0: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
f8c0: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f8d0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f8e0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f8f0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f900: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f910: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f920: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f930: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f940: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f950: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f960: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f970: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f980: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f990: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f9a0: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f9b0: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f9c0: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f9d0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f9e0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f9f0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
fa00: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
fa10: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
fa20: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
fa30: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
fa40: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
fa50: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
fa60: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
fa70: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
fa80: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
fa90: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
faa0: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
fab0: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
fac0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
fad0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
fae0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
faf0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
fb00: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
fb10: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
fb20: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
fb30: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
fb40: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
fb50: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
fb60: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
fb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
fb80: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
fb90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
fba0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
fbb0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
fbc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fbd0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
fbe0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fbf0: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
fc00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
fc10: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fc20: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
fc30: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
fc40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
fc60: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
fc70: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
fc80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fc90: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
fca0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
fcb0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fcc0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
fcd0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
fce0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
fcf0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
fd00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fd10: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
fd20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd30: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
fd40: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
fd50: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
fd60: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
fd70: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
fd80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
fd90: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
fda0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
fdb0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
fdc0: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
fdd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
fde0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
fdf0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
fe00: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
fe10: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
fe20: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
fe30: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
fe40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
fe50: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
fe60: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
fe70: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
fe80: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
fe90: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
fea0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
feb0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
fec0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
fed0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
fee0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fef0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
ff00: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
ff10: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
ff20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
ff30: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
ff40: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
ff50: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
ff60: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
ff70: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
ff80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ff90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
ffa0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ffb0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
ffc0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
ffd0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
ffe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
fff0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
10000 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
10010 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
10020 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10030 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
10040 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
10050 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
10060 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
10070 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
10080 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10090 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
100a0 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100c0 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
100d0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
100e0 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
100f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10120 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
10130 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
10140 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
10150 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
10160 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
10170 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10180 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10190 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
101a0 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
101b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
101c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
101d0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
101e0 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
101f0 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
10200 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
10210 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
10220 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
10230 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
10240 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
10250 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
10260 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
10270 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
10280 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
10290 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
102a0 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
102b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
102c0 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
102d0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
102e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
102f0 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
10300 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
10310 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
10320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10330 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
10340 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
10350 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
10360 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
10370 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
10380 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10390 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
103a0 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
103b0 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
103c0 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
103d0 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
103e0 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
103f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
10400 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
10410 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
10420 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
10430 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
10440 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
10450 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
10460 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
10470 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
10480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
10490 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
104a0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
104b0 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
104c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
104d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
104e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
104f0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
10500 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
10510 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
10520 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10530 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
10540 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
10550 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
10560 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
10570 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
10580 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
10590 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
105a0 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
105b0 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
105c0 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
105d0 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
105e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
105f0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
10600 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
10610 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
10620 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
10630 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10640 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10650 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
10660 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
10670 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10680 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10690 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
106a0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
106b0 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
106c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
106d0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
106e0 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
106f0 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
10700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10710 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
10720 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
10730 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
10740 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10750 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
10760 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
10770 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
10780 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
10790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
107a0 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
107b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
107c0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
107d0 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
107e0 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
107f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
10800 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
10810 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
10820 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
10830 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10840 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
10850 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
10860 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10870 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10880 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10890 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
108a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
108b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
108c0 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
108d0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
108e0 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
108f0 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10900 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10910 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
10920 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
10930 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
10940 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
10950 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
10960 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
10970 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10980 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10990 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
109a0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
109b0 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
109c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
109d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
109e0 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
109f0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10a00 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10a10 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10a20 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10a30 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10a40 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10a50 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10a60 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10a70 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10a80 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10a90 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10aa0 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10ab0 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10ac0 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10ad0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10ae0 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10af0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10b00 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10b10 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
10b20 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10b30 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10b40 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10b50 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10b60 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10b70 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10b80 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10b90 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10ba0 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10bb0 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10bc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10bd0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10be0 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10bf0 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10c10 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
10c20 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10c30 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10c40 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10c50 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10c60 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10c70 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10c80 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10c90 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10ca0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10cb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10cc0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10cd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10ce0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10cf0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10d00 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10d10 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
10d20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10d30 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10d40 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10d50 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10d60 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10d70 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10d80 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10d90 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10da0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10dc0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10dd0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10de0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10df0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e00 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10e10 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
10e20 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10e30 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10e40 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10e50 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10e60 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10e70 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10e80 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10e90 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10ea0 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10eb0 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10ec0 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10ed0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10ee0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10ef0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10f00 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10f10 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
10f20 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10f30 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10f40 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10f50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10f60 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10f70 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10f80 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10f90 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10fa0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10fb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10fc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10fd0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10fe0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10ff0 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
11000 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
11010 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
11020 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
11030 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
11040 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
11050 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
11060 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
11070 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
11080 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
11090 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
110a0 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
110b0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
110c0 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
110d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
110e0 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
110f0 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
11100 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
11110 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
11120 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
11130 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
11140 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
11150 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11160 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
11170 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
11180 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
11190 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
111a0 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
111b0 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
111c0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
111d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
111e0 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
111f0 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
11200 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
11210 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
11220 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
11230 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
11240 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
11250 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
11260 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
11270 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
11280 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
11290 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
112a0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
112b0 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
112c0 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
112d0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
112e0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
112f0 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
11300 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
11310 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
11320 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
11330 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
11340 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
11350 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11380 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
11390 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
113a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
113b0 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
113c0 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
113d0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113f0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
11400 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
11410 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
11420 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
11430 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
11440 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
11450 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
11460 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11480 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
11490 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
114a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
114b0 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
114c0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
114d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
114e0 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
114f0 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
11500 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
11510 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11520 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
11530 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11540 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
11550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11560 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
11570 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
11580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
11590 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
115a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
115b0 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
115c0 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
115d0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
115e0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
115f0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
11600 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
11610 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
11620 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
11630 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
11640 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
11650 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
11660 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
11670 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
11680 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
11690 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
116a0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
116b0 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
116c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
116d0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
116e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
116f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11700 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
11710 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
11720 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
11730 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
11740 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
11750 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
11760 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
11770 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
11780 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
11790 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
117a0 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
117b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
117c0 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
117d0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
117e0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
117f0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11800 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
11810 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11820 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11830 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
11840 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
11850 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
11860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11870 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11880 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
11890 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
118a0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
118b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
118c0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
118d0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
118e0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
118f0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11900 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11910 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
11920 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
11930 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11940 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11950 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
11960 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
11970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
119a0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
119b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
119c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
119d0 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
119e0 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
119f0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11a00 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11a10 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
11a20 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
11a30 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
11a40 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
11a50 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
11a60 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
11a70 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11a80 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11a90 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11aa0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11ab0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11ac0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11ad0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11ae0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11af0 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11b00 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11b10 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
11b20 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
11b30 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
11b40 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
11b50 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
11b60 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
11b70 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11b80 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11b90 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11ba0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11bb0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11bc0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11bd0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11be0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11bf0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11c00 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11c10 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
11c20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11c30 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
11c40 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11c50 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11c60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11c70 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11c80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11c90 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11ca0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11cb0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11cc0 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11cd0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11ce0 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11cf0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11d00 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11d10 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11d20 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11d30 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11d40 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11d50 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11d60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11d70 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11d80 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11d90 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11da0 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11db0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
11dc0 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74  urn pPager->iDat
11dd0 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  aVersion;.}../*.
11de0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
11df0 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
11e00 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
11e10 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
11e20 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
11e30 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
11e40 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
11e50 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
11e60 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
11e70 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
11e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
11e90 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
11ea0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
11eb0 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
11ec0 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
11ed0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
11ee0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11ef0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
11f00 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11f10 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11f20 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
11f30 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11f40 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11f50 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
11f60 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11f70 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
11f80 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
11f90 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
11fa0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
11fb0 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  | sqlite3Journal
11fc0 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
11fd0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
11fe0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11ff0 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
12000 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
12010 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
12020 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
12030 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
12040 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
12050 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
12060 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
12070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
12080 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
12090 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
120a0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
120b0 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
120c0 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
120d0 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
120e0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
120f0 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
12100 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
12110 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
12120 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
12130 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
12140 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
12150 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
12160 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
121a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
121b0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
121c0 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
121d0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
121e0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
121f0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
12200 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
12210 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
12220 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
12230 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
12240 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
12250 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
12260 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
12270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
12280 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
12290 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
122a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
122b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
122c0 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
122d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
122e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
122f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
12300 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12310 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
12320 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68  and not.** in th
12330 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f  e ERROR state. O
12340 74 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69  therwise, it swi
12350 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
12360 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  to PAGER_OPEN.**
12370 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   state..**.** If
12380 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
12390 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  t in exclusive-a
123a0 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20  ccess mode, the 
123b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
123c0 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  .** completely u
123d0 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20  nlocked. If the 
123e0 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
123f0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79   and the file-sy
12400 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  stem does.** not
12410 20 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44   exhibit the UND
12420 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12430 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  EN property, the
12440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12450 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69  .** closed (if i
12460 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a  t is open)..**.*
12470 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12480 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  s in ERROR state
12490 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
124a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
124b0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
124c0 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
124d0 68 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64  he are discarded
124e0 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e   before switchin
124f0 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68  g back to .** th
12500 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65  e OPEN state. Re
12510 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
12520 68 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73  her the pager is
12530 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
12540 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e  de.** or not, an
12550 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c  y journal file l
12560 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
12570 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74  system will be t
12580 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68  reated.** as a h
12590 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72  ot-journal and r
125a0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e  olled back the n
125b0 65 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d  ext time a read-
125c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
125d0 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69  s opened (by thi
125e0 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65  s or by any othe
125f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a  r connection)..*
12600 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
12610 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
12620 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73   *pPager){..  as
12630 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
12640 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
12650 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  ER .       || pP
12660 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
12670 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20  GER_OPEN .      
12680 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12690 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
126a0 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  .  );..  sqlite3
126b0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
126c0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
126d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
126e0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
126f0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
12700 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
12710 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
12720 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
12730 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
12740 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
12750 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64     sqlite3WalEnd
12760 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
12770 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
12780 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12790 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
127a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
127b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
127c0 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
127d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127e0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
127f0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
12800 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  y pagerUnlockDb(
12810 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63  ) */.    int iDc
12820 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72   = isOpen(pPager
12830 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44  ->fd)?sqlite3OsD
12840 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
12850 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
12860 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  :0;..    /* If t
12870 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
12880 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65  tem support dele
12890 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c  tion of open fil
128a0 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  es, then.    ** 
128b0 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
128c0 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
128d0 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
128e0 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69  e lock.  Otherwi
128f0 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65  se.    ** anothe
12900 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
12910 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
12920 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65  elete might dele
12930 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  te the file.    
12940 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ** out from unde
12950 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
12960 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12970 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12980 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  RY   & 5)!=1 );.
12990 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
129a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
129b0 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  FF      & 5)!=1 
129c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
129d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
129e0 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21  E_WAL      & 5)!
129f0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12a00 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12a10 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20  MODE_DELETE   & 
12a20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12a30 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12a40 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12a50 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12a60 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12a70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
12a80 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ST  & 5)==1 );. 
12a90 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26     if( 0==(iDc &
12aa0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
12ab0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
12ac0 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d  PEN).     || 1!=
12ad0 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12ae0 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b  Mode & 5).    ){
12af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12b00 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
12b10 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
12b20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12b30 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12b40 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c  tate and the cal
12b50 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  l to unlock the 
12b60 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
12b70 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20  file fails, set 
12b80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
12b90 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
12ba0 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
12bb0 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74  t.    ** above t
12bc0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55  he #define for U
12bd0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
12be0 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
12bf0 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a  f why this.    *
12c00 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  * is necessary..
12c10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
12c20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
12c30 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ager, NO_LOCK);.
12c40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12c50 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
12c60 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
12c70 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50  RROR ){.      pP
12c80 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e  ager->eLock = UN
12c90 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20  KNOWN_LOCK;.    
12ca0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  }..    /* The pa
12cb0 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65  ger state may be
12cc0 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41   changed from PA
12cd0 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47  GER_ERROR to PAG
12ce0 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20  ER_OPEN here.   
12cf0 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61   ** without clea
12d00 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63  ring the error c
12d10 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74  ode. This is int
12d20 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65  entional - the e
12d30 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  rror.    ** code
12d40 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20   is cleared and 
12d50 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20  the cache reset 
12d60 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  in the block bel
12d70 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
12d80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
12d90 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
12da0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
12db0 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61  ERROR );.    pPa
12dc0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12dd0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
12de0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12df0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a  AGER_OPEN;.  }..
12e00 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
12e10 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
12e20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12e30 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
12e40 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75  nnot be.  ** tru
12e50 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
12e60 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
12e70 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
12e80 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c  es to the pager,
12e90 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66  .  ** it can saf
12ea0 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f  ely move back to
12eb0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
12ec0 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  e. This happens 
12ed0 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72  in both.  ** nor
12ee0 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76  mal and exclusiv
12ef0 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  e-locking mode..
12f00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12f10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12f20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12f30 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
12f40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12f50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12f60 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
12f70 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
12f80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12f90 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12fa0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
12fb0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12fc0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12ff0 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
13000 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
13010 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
13020 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
13030 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
13040 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
13050 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
13060 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
13070 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73  SQLITE_OK;.    s
13090 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
130a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  Pager);.  }..  p
130b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
130c0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
130d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
130e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
130f0 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
13100 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13110 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
13120 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
13130 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
13140 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
13150 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
13160 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
13170 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
13180 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
13190 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
131a0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
131b0 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
131c0 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
131d0 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
131e0 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
131f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
13200 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
13210 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
13220 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
13230 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
13240 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
13250 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
13260 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
13270 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
13280 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
13290 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
132a0 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
132b0 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
132c0 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
132d0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
132e0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
132f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
13300 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
13310 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
13320 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
13330 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
13340 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
13350 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
13360 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
13370 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
13380 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
13390 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
133a0 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
133b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
133c0 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
133d0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
133e0 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
133f0 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
13400 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
13410 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
13420 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
13430 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
13440 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
13450 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
13460 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
13470 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
13480 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
13490 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
134a0 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
134b0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
134c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
134d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
134e0 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
134f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
13500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13510 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
13520 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
13530 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
13540 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
13550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13560 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
13570 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
13580 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13590 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
135a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
135b0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
135c0 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
135d0 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
135e0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
135f0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
13600 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
13610 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
13620 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
13630 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
13640 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13650 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
13660 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
13670 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
13680 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13690 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
136a0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
136b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
136c0 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
136d0 68 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  he write transac
136e0 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61  tion open on pPa
136f0 67 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ger is being com
13700 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d  mitted (bCommit=
13710 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64  =1).** or rolled
13720 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d   back (bCommit==
13730 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)..**.** Return
13740 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c   TRUE if and onl
13750 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70  y if all dirty p
13760 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66  ages should be f
13770 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a  lushed to disk..
13780 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a  **.** Rules:.**.
13790 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d  **   *  For non-
137a0 54 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20  TEMP databases, 
137b0 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64  always sync to d
137c0 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  isk.  This is ne
137d0 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20  cessary.**      
137e0 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  for transactions
137f0 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a   to be durable..
13800 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20  **.**   *  Sync 
13810 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e  TEMP database on
13820 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28  ly on a COMMIT (
13830 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20  not a ROLLBACK) 
13840 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67  when the backing
13850 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61  .**      file ha
13860 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61  s been created a
13870 6c 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70  lready (via a sp
13880 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65  ill on pagerStre
13890 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20  ss()) and.**    
138a0 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65    when the numbe
138b0 72 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  r of dirty pages
138c0 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65   in memory excee
138d0 64 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f  ds 25% of the to
138e0 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68  tal.**      cach
138f0 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e size..*/.stati
13900 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68  c int pagerFlush
13910 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  OnCommit(Pager *
13920 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d  pPager, int bCom
13930 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67  mit){.  if( pPag
13940 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
13950 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
13960 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74  ( !bCommit ) ret
13970 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73  urn 0;.  if( !is
13980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
13990 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
139a0 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43  eturn (sqlite3PC
139b0 61 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79  achePercentDirty
139c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
139d0 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )>=25);.}../*.**
139e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
139f0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
13a00 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
13a10 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
13a20 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
13a30 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
13a40 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
13a50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13a60 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
13a70 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
13a80 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
13a90 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
13aa0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
13ab0 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
13ac0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
13ad0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
13ae0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
13af0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
13b00 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
13b10 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
13b20 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
13b30 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
13b40 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
13b50 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
13b60 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
13b70 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
13b80 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
13b90 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
13ba0 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
13bb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
13bc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13bd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
13be0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
13bf0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
13c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
13c10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13c20 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
13c30 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
13c40 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
13c50 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
13c60 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
13c70 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
13c80 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
13c90 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
13ca0 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
13cb0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
13cc0 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
13cd0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
13ce0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
13cf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
13d00 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
13d10 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
13d20 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
13d30 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13d40 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
13d50 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
13d60 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
13d70 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
13d80 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
13d90 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
13da0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
13db0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13dc0 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
13dd0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
13de0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
13df0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
13e00 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
13e10 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
13e20 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
13e30 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
13e40 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
13e50 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
13e60 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
13e70 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
13e80 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13e90 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
13ea0 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
13eb0 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
13ec0 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
13ed0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
13ee0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
13ef0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
13f00 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
13f10 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
13f20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
13f30 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
13f40 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
13f50 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
13f60 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
13f70 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13f80 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
13f90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13fa0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
13fb0 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
13fc0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
13fd0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
13fe0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13ff0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
14000 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
14010 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
14020 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
14030 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
14040 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
14050 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
14060 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
14070 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
14080 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
14090 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
140a0 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
140b0 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
140c0 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
140d0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
140e0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
140f0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
14100 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
14110 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
14120 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
14130 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
14140 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
14150 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
14160 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
14170 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
14180 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
14190 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
141a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
141b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
141c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
141d0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
141e0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
141f0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
14200 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
14210 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
14220 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
14230 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
14240 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14250 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
14260 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
14270 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
14280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14290 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
142a0 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
142b0 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
142c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
142d0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
142e0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
142f0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
14300 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
14310 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
14320 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
14330 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
14340 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
14350 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
14360 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
14370 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
14380 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
14390 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
143a0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
143b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
143c0 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f  sMaster, int bCo
143d0 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  mmit){.  int rc 
143e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
143f0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14400 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
14410 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
14420 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
14430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14440 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14450 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
14460 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
14470 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ..  /* Do nothin
14480 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64  g if the pager d
14490 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
144a0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
144b0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61  action.  ** or a
144c0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
144d0 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75  ED lock. This fu
144e0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
144f0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a  lled when there.
14500 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65    ** is no write
14510 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
14520 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56  ive but a RESERV
14530 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
14540 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20  ck is.  ** held 
14550 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d  under two circum
14560 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20  stances:.  **.  
14570 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20  **   1. After a 
14580 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a  successful hot-j
14590 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
145a0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69   it is called wi
145b0 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74  th.  **      eSt
145c0 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
145d0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
145e0 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a  SIVE_LOCK..  **.
145f0 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63    **   2. If a c
14600 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c  onnection with l
14610 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14620 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e  usive holding an
14630 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a   EXCLUSIVE .  **
14640 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63        lock switc
14650 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b  hes back to lock
14660 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
14670 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65  and then execute
14680 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65  s a.  **      re
14690 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad-transaction, 
146a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
146b0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74   called with eSt
146c0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
146d0 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64  R .  **      and
146e0 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
146f0 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  E_LOCK when the 
14700 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14710 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f   is closed..  */
14720 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
14730 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14740 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
14750 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
14760 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
14770 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14780 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
14790 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50  TER_LOCKED && pP
147a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45  ager->eLock<RESE
147b0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
147c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
147d0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73  K;.  }..  releas
147e0 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
147f0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
14800 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
14810 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
14820 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a  >pInJournal==0 .
14830 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
14840 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
14850 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
14860 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
14870 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a  P_BATCH_ATOMIC).
14880 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65    );.  if( isOpe
14890 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
148a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
148b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
148c0 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
148d0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
148e0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
148f0 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
14900 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14910 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
14920 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
14930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14940 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14950 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
14960 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14970 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14980 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
14990 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
149a0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
149b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
149c0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
149d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
149e0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
149f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14a00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14a10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14a20 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
14a30 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
14a40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14a50 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14a60 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
14a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
14a80 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
14a90 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
14aa0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
14ab0 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
14ac0 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
14ad0 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
14ae0 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
14af0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
14b00 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
14b10 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
14b20 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
14b30 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
14b40 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
14b50 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
14b60 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
14b70 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
14b80 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
14b90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14bb0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14bc0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
14bd0 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
14be0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
14bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14c00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
14c10 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14c20 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14c30 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14c40 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
14c50 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14c60 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14c70 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
14c80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
14c90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
14ca0 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
14cb0 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
14cc0 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
14cd0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
14ce0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14cf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
14d00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
14d10 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
14d20 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
14d30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
14d40 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
14d50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
14d60 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
14d70 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
14d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14d90 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
14da0 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
14db0 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
14dc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
14dd0 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
14de0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14df0 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
14e00 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
14e10 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
14e20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
14e30 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
14e40 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
14e50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14e60 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14e70 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
14e80 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
14e90 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14ea0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14eb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
14ec0 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
14ed0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14ee0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14ef0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
14f00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
14f10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14f20 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14f30 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
14f40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14f50 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14f60 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
14f70 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
14f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14f90 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14fa0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
14fb0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
14fc0 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20  extraSync);.    
14fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
14fe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14ff0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
15000 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
15010 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
15020 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
15030 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
15040 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
15050 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
15060 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
15070 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
15080 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
15090 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
150a0 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
150b0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
150c0 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
150d0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
150e0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
150f0 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
15100 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
15110 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
15120 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
15130 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
15140 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
15150 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
15160 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
15170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15180 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72  ( MEMDB || pager
15190 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50  FlushOnCommit(pP
151a0 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29  ager, bCommit) )
151b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
151c0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
151d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
151e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
15200 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67  earWritable(pPag
15210 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
15220 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
15230 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
15240 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
15250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15260 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
15270 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
15280 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  {.    /* Drop th
15290 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b  e WAL write-lock
152a0 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20  , if any. Also, 
152b0 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
152c0 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a  n was in .    **
152d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
152e0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74  clusive mode but
152f0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64   is no longer, d
15300 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
15310 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68  E .    ** lock h
15320 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
15330 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
15340 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
15350 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
15360 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
15370 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
15380 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
15390 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OK );.  }else if
153a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
153b0 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50  && bCommit && pP
153c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
153d0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
153e0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ){.    /* This b
153f0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
15400 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
15410 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
15420 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
15430 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20  .    ** mode if 
15440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15450 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72  e on disk is lar
15460 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
15470 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
15480 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
15490 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  t the journal ha
154a0 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
154b0 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
154c0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63  tion .    ** suc
154d0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74  cessfully commit
154e0 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43  ted, but the EXC
154f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73  LUSIVE lock is s
15500 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
15510 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
15520 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74   it is safe to t
15530 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
15540 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73  base file to its
15550 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
15560 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20  required size.  
15570 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15580 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15590 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
155a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
155b0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
155c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
155d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
155e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
155f0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  mmit ){.    rc =
15600 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15610 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
15620 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
15630 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
15640 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15650 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
15660 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
15670 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
15680 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15690 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
156a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
156b0 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
156c0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
156d0 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
156e0 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
156f0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
15700 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
15710 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
15720 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
15730 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15740 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
15750 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
15760 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
15770 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
15780 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
15790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
157a0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
157b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
157c0 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
157d0 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
157e0 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
157f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15800 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
15810 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
15820 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
15830 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
15840 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
15850 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
15860 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
15870 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
15880 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
15890 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
158a0 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
158b0 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
158c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
158d0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
158e0 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
158f0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
15900 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
15910 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
15920 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
15930 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
15940 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
15950 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
15960 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
15970 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
15980 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
15990 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
159a0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
159b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
159c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
159d0 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
159e0 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
159f0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
15a00 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15a10 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
15a20 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
15a30 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
15a40 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
15a50 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
15a60 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
15a70 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
15a80 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
15a90 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
15aa0 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
15ab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
15ac0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15ad0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
15ae0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15af0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15b00 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
15b10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
15b20 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
15b30 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
15b40 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
15b50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15b60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15b70 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
15b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
15b90 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
15ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
15bb0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
15bc0 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
15bd0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15be0 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
15bf0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
15c00 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
15c10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15c20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15c30 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
15c40 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
15c50 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
15c60 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
15c70 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
15c80 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
15c90 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
15ca0 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
15cb0 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
15cc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
15cd0 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
15ce0 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
15cf0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
15d00 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
15d10 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
15d20 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
15d30 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
15d40 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
15d50 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
15d60 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
15d70 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
15d80 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
15d90 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
15da0 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
15db0 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
15dc0 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
15dd0 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
15de0 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
15df0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
15e00 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
15e10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
15e20 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
15e30 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
15e40 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15e50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15e60 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15e70 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15e80 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15e90 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15ea0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15eb0 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15ec0 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15ed0 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15ee0 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
15ef0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
15f00 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
15f10 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
15f20 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
15f30 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
15f40 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15f50 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15f60 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15f70 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15f80 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15f90 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15fa0 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15fb0 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15fc0 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15fd0 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15fe0 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
15ff0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
16000 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
16010 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
16020 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
16030 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
16040 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
16050 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
16060 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
16070 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
16080 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
16090 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
160a0 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
160b0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
160c0 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
160d0 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
160e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
160f0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
16100 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
16110 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
16120 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
16130 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
16140 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
16150 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
16160 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
16170 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
16180 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
16190 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
161a0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
161b0 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
161c0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
161d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
161e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
161f0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
16200 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
16210 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
16220 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
16230 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
16260 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
16270 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
16280 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
16290 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
162a0 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
162b0 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
162c0 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
162d0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
162e0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
162f0 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
16300 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16310 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
16320 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
16330 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
16340 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
16350 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
16360 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
16370 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
16380 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
16390 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
163a0 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
163b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
163c0 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
163d0 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
163e0 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
163f0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
16400 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
16410 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
16420 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
16430 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
16440 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
16450 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
16460 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
16470 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
16480 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
16490 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
164a0 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
164b0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
164c0 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
164d0 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
164e0 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
164f0 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
16500 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
16510 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
16520 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
16530 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
16540 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
16550 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
16560 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
16570 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
16580 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
16590 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
165a0 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
165b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
165c0 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
165d0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
165e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
165f0 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
16600 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16610 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
16620 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
16630 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
16640 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
16650 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
16660 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
16670 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16680 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
16690 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
166a0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
166b0 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
166c0 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
166d0 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
166e0 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
166f0 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
16700 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16710 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
16720 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
16730 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
16740 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
16750 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
16760 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
16770 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
16780 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
16790 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
167a0 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
167b0 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
167c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
167d0 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
167e0 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
167f0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16800 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
16810 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
16820 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16830 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
16840 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
16850 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
16860 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
16870 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
16880 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
16890 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
168a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
168b0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
168c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
168d0 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
168e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
168f0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16900 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
16910 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
16920 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
16930 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
16940 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
16950 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
16960 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
16970 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
16980 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
16990 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
169a0 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
169b0 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
169c0 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
169d0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
169e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
169f0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16a00 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
16a10 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
16a20 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
16a30 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
16a40 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
16a50 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
16a60 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
16a70 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
16a80 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
16a90 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
16aa0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
16ab0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
16ac0 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
16ad0 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
16ae0 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
16af0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
16b00 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
16b10 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
16b20 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
16b30 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
16b40 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
16b50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16b60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
16b70 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
16b80 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
16b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16ba0 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
16bb0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
16bc0 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16be0 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
16bf0 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
16c00 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c20 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
16c30 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
16c40 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
16c50 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
16c60 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
16c70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
16c80 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
16c90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
16ca0 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
16cb0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
16cc0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16cd0 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
16ce0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
16cf0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16d00 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
16d10 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
16d20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
16d30 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
16d40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16d50 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
16d60 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
16d70 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16da0 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
16db0 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
16dc0 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16de0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
16df0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
16e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16e10 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
16e20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
16e30 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
16e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16e50 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16e80 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16e90 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
16ea0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f  TE_HAS_CODEC.  /
16eb0 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c  * The jrnlEnc fl
16ec0 61 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f  ag is true if Jo
16ed0 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75  urnal pages shou
16ee0 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72  ld be passed thr
16ef0 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ough.  ** the co
16f00 64 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73  dec.  It is fals
16f10 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65  e for pure in-me
16f20 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a  mory journals. *
16f30 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72  /.  const int jr
16f40 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a  nlEnc = (isMainJ
16f50 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  rnl || pPager->s
16f60 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b  ubjInMemory==0);
16f70 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
16f80 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
16f90 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
16fa0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
16fb0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16fc0 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16fd0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16fe0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16ff0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
17000 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
17010 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
17020 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
17030 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
17040 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
17050 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
17060 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
17070 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
17080 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
17090 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
170a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
170b0 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
170c0 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
170d0 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
170e0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
170f0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
17100 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
17110 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
17120 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
17130 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
17140 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
17150 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
17160 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
17170 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
17180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
17190 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
171a0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
171b0 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
171c0 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
171d0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
171e0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
171f0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
17200 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17210 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
17220 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
17230 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
17240 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
17250 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
17260 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
17270 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
17280 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
17290 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
172a0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
172b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
172c0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
172d0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
172e0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
172f0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
17300 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
17310 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
17320 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
17330 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17340 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
17350 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
17360 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
17370 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
17380 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
17390 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
173a0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
173b0 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
173c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
173d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
173e0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
173f0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
17400 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
17410 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
17420 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
17430 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17440 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
17450 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17460 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17470 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
17480 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
17490 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
174a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
174b0 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
174c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
174d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
174e0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
174f0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
17500 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
17510 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
17520 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
17530 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
17540 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
17550 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
17560 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
17570 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
17580 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
17590 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
175a0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
175b0 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
175c0 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
175d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
175e0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
175f0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
17600 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
17610 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
17620 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
17630 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
17640 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
17650 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
17660 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
17670 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
17680 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
17690 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
176a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
176b0 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
176c0 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
176d0 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
176e0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
176f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17700 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
17710 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
17720 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
17730 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
17740 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
17750 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17760 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
17770 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
17780 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
17790 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
177a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
177b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
177c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
177d0 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
177e0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
177f0 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
17800 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
17810 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
17820 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
17830 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
17840 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
17850 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
17860 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
17870 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
17880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
178a0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
178b0 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
178c0 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
178d0 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
178e0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
178f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
17900 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
17910 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
17920 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
17930 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
17940 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
17950 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
17960 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
17970 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
17980 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
17990 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
179a0 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
179b0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
179c0 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
179d0 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
179e0 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
179f0 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
17a00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17a10 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
17a20 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
17a30 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
17a40 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
17a50 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
17a60 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
17a70 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
17a80 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
17a90 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
17aa0 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
17ab0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17ac0 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
17ad0 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
17ae0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17af0 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
17b00 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
17b10 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
17b20 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
17b30 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
17b40 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
17b50 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
17b60 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
17b70 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
17b80 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
17b90 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
17ba0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
17bb0 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
17bc0 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
17bd0 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
17be0 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
17bf0 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
17c00 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
17c10 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
17c20 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
17c30 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
17c40 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
17c50 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
17c60 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
17c70 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
17c80 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
17c90 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
17ca0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17cb0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17cc0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17cd0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17ce0 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17cf0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17d00 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17d10 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
17d20 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
17d30 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17d40 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
17d50 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
17d60 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
17d70 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
17d80 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
17d90 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17da0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
17db0 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17dc0 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17dd0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17de0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17df0 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17e00 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17e10 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
17e20 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
17e30 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17e40 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17e50 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
17e60 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
17e70 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17e80 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17e90 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17ea0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17eb0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17ec0 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17ee0 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17ef0 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17f00 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17f10 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17f20 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
17f30 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17f40 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17f50 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
17f60 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
17f70 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17f80 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17f90 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17fa0 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17fb0 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17fd0 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17fe0 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17ff0 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
18000 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
18010 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
18020 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
18030 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
18040 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
18050 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
18060 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
18070 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
18080 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
18090 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
180a0 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
180b0 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
180c0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
180d0 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
180e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
180f0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
18100 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
18110 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
18120 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
18130 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
18140 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
18150 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
18160 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
18170 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
18180 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
18190 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
181a0 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
181b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
181c0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
181d0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
181e0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
181f0 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
18200 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
18210 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
18220 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
18230 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  g==0 || pPager->
18240 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41  tempFile );.  PA
18250 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
18260 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
18270 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
18280 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
18290 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
182a0 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
182b0 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
182c0 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
182d0 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
182e0 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
182f0 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
18300 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
18310 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
18320 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
18330 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
18340 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
18350 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
18360 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18370 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
18380 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
18390 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
183a0 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
183b0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
183c0 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
183d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
183e0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
183f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
18400 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
18410 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
18420 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
18430 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
18440 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
18450 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
18460 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
18470 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
18480 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
18490 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
184a0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
184b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
184c0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
184d0 65 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d  e data read from
184e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
184f0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
18500 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  ase file..    **
18510 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
18520 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61   safe even for a
18530 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
18540 62 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61  base - as the da
18550 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  ta.    ** was en
18560 63 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69  crypted before i
18570 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  t was written to
18580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18590 65 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  e. The exception
185a0 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68  .    ** is if th
185b0 65 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20  e data was just 
185c0 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d  read from an in-
185d0 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
185e0 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20  al. In that.    
185f0 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20  ** case it must 
18600 62 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72  be encrypted her
18610 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63  e before it is c
18620 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64  opied into the d
18630 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
18640 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20  ile.  */.#ifdef 
18650 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18660 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e  .    if( !jrnlEn
18670 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  c ){.      CODEC
18680 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
18690 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
186a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
186b0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63  aData);.      rc
186c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
186d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
186e0 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
186f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18700 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  t);.      CODEC1
18710 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
18720 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
18730 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
18740 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
18750 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18760 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
18770 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
18780 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18790 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20  ze, ofst);..    
187a0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
187b0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
187c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
187d0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
187e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
187f0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
18800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18810 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69  AS_CODEC.      i
18820 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  f( jrnlEnc ){.  
18830 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18840 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18850 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18860 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
18870 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
18880 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
18890 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
188a0 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
188b0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
188c0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
188d0 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
188e0 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a  EM_BKPT,aData);.
188f0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
18900 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  if.      sqlite3
18910 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
18920 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
18930 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
18940 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18950 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
18960 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
18970 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18980 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
18990 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
189a0 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
189b0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
189c0 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
189d0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
189e0 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
189f0 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
18a00 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
18a10 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
18a20 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
18a30 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
18a40 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
18a50 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
18a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
18a70 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
18a80 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
18a90 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
18aa0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
18ab0 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
18ac0 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
18ad0 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
18ae0 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
18af0 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
18b00 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
18b10 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
18b20 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
18b30 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
18b40 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
18b50 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
18b60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
18b70 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
18b80 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
18b90 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
18ba0 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
18bb0 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
18bc0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
18bd0 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
18be0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
18bf0 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
18c00 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
18c10 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
18c20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
18c30 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
18c40 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
18c50 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
18c60 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
18c70 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
18c80 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
18c90 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
18ca0 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
18cb0 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
18cc0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
18cd0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18ce0 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
18cf0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
18d00 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18d10 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
18d20 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  BACK)==0 );.    
18d30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18d40 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
18d50 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63  ROLLBACK;.    rc
18d60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
18d70 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
18d80 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
18d90 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
18da0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
18db0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
18dc0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
18dd0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
18de0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
18df0 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
18e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
18e10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
18e20 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
18e30 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
18e40 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
18e50 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
18e60 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
18e70 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
18e80 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
18e90 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
18ea0 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
18eb0 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
18ec0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
18ed0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
18ee0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
18ef0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
18f00 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
18f10 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
18f20 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
18f30 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
18f40 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18f50 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18f60 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18f70 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18f80 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18f90 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18fa0 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18fb0 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18fc0 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18fd0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18fe0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
18ff0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
19000 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73  g);.    /* It us
19010 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71  ed to be that sq
19020 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
19030 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61  lean(pPg) was ca
19040 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a  lled here.  But.
19050 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c      ** that call
19060 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61   was dangerous a
19070 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74  nd had no detect
19080 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e  able benefit sin
19090 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20  ce the cache.   
190a0 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20   ** is normally 
190b0 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74  cleaned by sqlit
190c0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
190d0 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  () after rollbac
190e0 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20  k and so.    ** 
190f0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
19100 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73  . */.    pager_s
19110 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
19120 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
19130 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
19140 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
19150 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
19160 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
19170 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
19180 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
19190 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
191a0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
191b0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
191c0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
191d0 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
191e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
191f0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
19200 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
19210 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
19220 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51  m disk */.#if SQ
19230 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19240 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29     if( jrnlEnc )
19250 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c  { CODEC1(pPager,
19260 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
19270 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
19280 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23  NOMEM_BKPT); }.#
19290 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
192a0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
192b0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
192c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
192d0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
192e0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
192f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
19300 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
19310 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
19320 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
19330 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19340 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
19350 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
19360 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
19370 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
19380 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
19390 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
193a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
193b0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
193c0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
193d0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
193e0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
193f0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
19400 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
19410 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
19420 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
19430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19440 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
19450 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19460 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
19470 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
19480 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
19490 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
194a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
194b0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
194c0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
194d0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
194e0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
194f0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
19500 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
19510 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
19520 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
19530 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
19540 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
19550 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
19560 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
19570 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
19580 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
19590 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
195a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
195b0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
195c0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
195d0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
195e0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
195f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19600 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
19610 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
19620 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
19630 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
19640 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
19650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19660 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
19670 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
19680 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
19690 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
196a0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
196b0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
196c0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
196d0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
196e0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
196f0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
19700 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
19710 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
19720 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
19730 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
19740 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
19750 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
19760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19770 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
19780 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
19790 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
197a0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
197b0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
197c0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
197d0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
197e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
197f0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
19800 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
19810 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
19820 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
19830 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
19840 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
19850 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
19860 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
19870 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
19880 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
19890 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
198a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
198b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
198c0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
198d0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
198e0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
198f0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
19900 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
19910 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
19920 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
19930 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19940 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
19950 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
19960 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
19970 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
19980 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
19990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
199a0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
199b0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
199c0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
199d0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
199e0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
199f0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
19a00 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
19a10 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
19a20 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
19a30 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
19a40 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
19a50 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
19a60 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
19a70 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
19a80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
19a90 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
19aa0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
19ab0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
19ac0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19ad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19ae0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
19af0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
19b00 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
19b10 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
19b20 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
19b40 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
19b50 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
19b60 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
19b70 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
19b80 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
19b90 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
19ba0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
19bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19bc0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
19bd0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
19be0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
19bf0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
19c00 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
19c10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
19c20 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
19c30 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
19c40 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
19c50 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19c60 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
19c70 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
19c80 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
19c90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
19ca0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
19cb0 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
19cc0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
19cd0 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
19ce0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19cf0 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
19d00 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
19d10 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
19d20 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
19d30 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
19d40 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
19d50 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
19d60 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
19d70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
19d80 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
19d90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
19da0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
19db0 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
19dc0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
19dd0 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
19de0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
19df0 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
19e00 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19e10 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
19e30 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
19e40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
19e50 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
19e60 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
19e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19e80 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
19e90 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
19ea0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
19eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19ec0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19ed0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c  ter_out;..  /* L
19ee0 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
19ef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19f00 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
19f10 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a  tained from.  **
19f20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
19f30 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
19f40 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
19f50 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69  al.   Also obtai
19f60 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e  n.  ** sufficien
19f70 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73  t space (in zMas
19f80 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20  terPtr) to hold 
19f90 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73  the names of mas
19fa0 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ter.  ** journal
19fb0 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64   files extracted
19fc0 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f   from regular ro
19fd0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e  llback-journals.
19fe0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
19ff0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1a000 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
1a010 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
1a020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a030 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
1a040 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72  ut;.  nMasterPtr
1a050 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
1a060 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72  ame+1;.  zMaster
1a070 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
1a080 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  3Malloc(nMasterJ
1a090 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
1a0a0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
1a0b0 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
1a0c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a0d0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1a0e0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a0f0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
1a100 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
1a110 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
1a120 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
1a130 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1a140 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
1a150 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
1a160 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
1a170 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
1a180 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
1a190 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a1a0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
1a1b0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
1a1c0 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
1a1d0 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
1a1e0 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
1a1f0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
1a200 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
1a210 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
1a220 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
1a230 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1a240 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
1a250 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1a260 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
1a270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
1a290 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a2a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1a2b0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
1a2c0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
1a2d0 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
1a2e0 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
1a2f0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
1a300 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
1a310 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
1a320 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
1a330 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
1a340 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
1a350 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
1a360 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
1a370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1a380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a390 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
1a3a0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
1a3b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
1a3c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1a3d0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
1a3e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1a3f0 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
1a400 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
1a410 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
1a420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a430 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1a440 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a450 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
1a460 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1a470 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
1a480 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
1a490 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71  erPtr);.      sq
1a4a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
1a4b0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
1a4c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a4d0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1a4e0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a4f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20       }..      c 
1a500 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
1a510 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
1a520 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
1a530 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20  )==0;.      if( 
1a540 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
1a550 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
1a560 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
1a570 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a580 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
1a590 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a5a0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
1a5b0 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61     }.    zJourna
1a5c0 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
1a5d0 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
1a5e0 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69  1);.  }. .  sqli
1a5f0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a600 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
1a610 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
1a620 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
1a630 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
1a640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
1a650 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
1a660 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
1a670 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1a680 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
1a690 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
1a6a0 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
1a6b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a6c0 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  Master);.  }.  r
1a6d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a6e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1a6f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
1a700 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
1a710 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1a720 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
1a730 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
1a740 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
1a750 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
1a760 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
1a770 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
1a780 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1a790 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
1a7a0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1a7b0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
1a7c0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
1a7d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
1a7e0 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70  t open, or the p
1a7f0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
1a800 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f  ither.** DBMOD o
1a810 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
1a820 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1a830 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
1a840 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20  e, the size .** 
1a850 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  of the file is c
1a860 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
1a870 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
1a880 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1a890 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65  tes). .** If the
1a8a0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
1a8b0 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
1a8c0 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
1a8d0 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
1a8e0 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
1a8f0 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
1a900 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
1a910 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65   Or, it might be
1a920 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
1a930 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
1a940 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1a950 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
1a960 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
1a970 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
1a980 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
1a990 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
1a9a0 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
1a9b0 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
1a9c0 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
1a9d0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
1a9e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
1a9f0 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
1aa00 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
1aa10 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
1aa20 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
1aa30 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
1aa40 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
1aa50 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1aa60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
1aa70 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1aa80 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
1aa90 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
1aaa0 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
1aab0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
1aac0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
1aad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1aae0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
1aaf0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1ab00 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
1ab10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ab20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ab30 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
1ab40 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
1ab50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1ab60 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
1ab70 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
1ab80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
1ab90 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
1aba0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1abb0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
1abc0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1abd0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
1abe0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
1abf0 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
1ac00 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
1ac10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1ac20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ac30 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
1ac40 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
1ac50 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
1ac60 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
1ac70 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
1ac80 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
1ac90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1aca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
1acb0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
1acc0 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
1acd0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
1ace0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1acf0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
1ad00 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
1ad10 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
1ad20 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
1ad30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ad40 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
1ad50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
1ad60 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
1ad70 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
1ad80 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
1ad90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
1ada0 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
1adb0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1adc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
1add0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
1ade0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1adf0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1ae00 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
1ae10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1ae20 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
1ae30 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
1ae40 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1ae50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1ae60 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1ae70 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
1ae80 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
1ae90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1aea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1aeb0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1aec0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
1aed0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
1aee0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1af00 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
1af10 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1af20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
1af30 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
1af40 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
1af50 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
1af60 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
1af70 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
1af80 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
1af90 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
1afa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1afb0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
1afc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
1afd0 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
1afe0 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
1aff0 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
1b000 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
1b010 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
1b020 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b030 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
1b040 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
1b050 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
1b060 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1b070 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
1b080 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
1b090 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
1b0a0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
1b0b0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
1b0c0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
1b0d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1b0e0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1b0f0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
1b100 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
1b110 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
1b120 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1b130 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  e used .** to de
1b140 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1b150 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
1b160 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
1b170 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
1b180 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
1b190 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
1b1a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
1b1b0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
1b1c0 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
1b1d0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b1e0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
1b1f0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
1b200 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
1b210 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
1b220 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
1b230 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
1b240 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
1b250 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1b260 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
1b270 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
1b280 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
1b290 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
1b2a0 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
1b2b0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
1b2c0 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
1b2d0 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
1b2e0 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49  OR_SIZE..**.** I
1b2f0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74  f the file has t
1b300 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
1b310 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b320 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68  ITE property, th
1b330 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66  en set.** the ef
1b340 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b350 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ize to its minim
1b360 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20  um value (512). 
1b370 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a   The purpose of.
1b380 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ** pPager->secto
1b390 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69  rSize is to defi
1b3a0 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61  ne the "blast ra
1b3b0 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74  dius" of bytes t
1b3c0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1b3d0 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f  nge if a crash o
1b3e0 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74  ccurs while writ
1b3f0 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
1b400 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20  byte in.** that 
1b410 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68  range.  But with
1b420 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1b430 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20  RITE, the blast 
1b440 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a  radius is zero.*
1b450 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20  * (that is what 
1b460 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b470 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77  ITE means), so w
1b480 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73  e minimize the s
1b490 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20  ector.** size.  
1b4a0 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
1b4b0 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74  mpatibility of t
1b4c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1b4d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  nal file format,
1b4e0 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65  .** we cannot re
1b4f0 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1b500 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62  ve sector size b
1b510 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  elow 512..*/.sta
1b520 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
1b530 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
1b540 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
1b550 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b560 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1b570 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
1b580 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1b590 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  le.   || (sqlite
1b5a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1b5b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1b5c0 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20  >fd) & .        
1b5d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1b5e0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1b5f0 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a  RWRITE)!=0.  ){.
1b600 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
1b610 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
1b620 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
1b630 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
1b640 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
1b650 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
1b660 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
1b670 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
1b680 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1b690 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
1b6a0 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50  fault. */.    pP
1b6b0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1b6c0 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b   = 512;.  }else{
1b6d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1b6e0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
1b6f0 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  3SectorSize(pPag
1b700 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  er->fd);.  }.}..
1b710 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
1b720 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
1b730 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
1b740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1b750 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
1b760 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
1b770 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
1b780 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
1b790 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1b7a0 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
1b7b0 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
1b7c0 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
1b7d0 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
1b7e0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
1b7f0 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
1b800 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b810 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1b820 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
1b830 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
1b840 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
1b850 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
1b860 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1b870 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
1b880 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
1b890 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
1b8a0 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
1b8b0 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
1b8c0 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
1b8d0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b8e0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
1b8f0 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
1b900 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
1b910 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
1b920 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
1b930 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b940 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1b950 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
1b960 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
1b970 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
1b980 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
1b990 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
1b9a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b9b0 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
1b9c0 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
1b9d0 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
1b9e0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1b9f0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
1ba00 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1ba10 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1ba20 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
1ba30 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
1ba40 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
1ba50 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
1ba60 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
1ba70 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
1ba80 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
1ba90 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
1baa0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1bab0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
1bac0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
1bad0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1bae0 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
1baf0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1bb00 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
1bb10 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
1bb20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1bb30 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
1bb40 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
1bb50 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
1bb60 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
1bb70 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
1bb80 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
1bb90 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
1bba0 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
1bbb0 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
1bbc0 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
1bbd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
1bbe0 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
1bbf0 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
1bc00 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
1bc10 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
1bc20 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
1bc30 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
1bc40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1bc50 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
1bc60 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
1bc70 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
1bc80 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
1bc90 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
1bca0 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
1bcb0 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
1bcc0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1bcd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1bce0 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
1bcf0 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
1bd00 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
1bd10 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
1bd20 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
1bd30 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
1bd40 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
1bd50 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
1bd60 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
1bd70 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
1bd80 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
1bd90 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
1bda0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1bdb0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1bdc0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
1bdd0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
1bde0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1bdf0 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
1be00 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
1be10 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
1be20 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
1be30 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
1be40 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
1be50 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
1be60 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
1be70 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1be80 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
1be90 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
1bea0 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1beb0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1bec0 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1bed0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1bee0 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1bef0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1bf00 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1bf10 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1bf20 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1bf30 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1bf40 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1bf50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1bf60 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1bf70 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1bf80 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1bf90 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1bfa0 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1bfb0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1bfc0 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1bfd0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1bfe0 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1bff0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1c000 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1c010 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1c020 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1c030 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1c040 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1c050 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1c060 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1c070 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1c080 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1c090 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1c0a0 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1c0b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c0c0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1c0d0 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1c0e0 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1c0f0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1c100 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1c110 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1c120 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1c130 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1c140 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1c150 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1c160 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1c170 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1c180 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1c190 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1c1a0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1c1b0 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1c1c0 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1c1d0 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1c1e0 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1c1f0 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1c200 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1c210 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1c220 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1c230 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1c240 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1c250 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1c260 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1c270 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1c280 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1c290 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2b0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1c2c0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1c2d0 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1c2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c2f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1c300 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1c310 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c330 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1c340 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1c350 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1c360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c370 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1c380 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1c390 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c3b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1c3c0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1c3d0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1c3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c3f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1c400 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1c410 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1c420 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1c430 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1c440 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1c450 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1c460 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1c470 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1c480 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1c490 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1c4a0 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
1c4b0 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20  nPlayback = 0;  
1c4c0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1c4d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
1c4e0 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72  stored from jour
1c4f0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  nal */.  u32 sav
1c500 65 64 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  edPageSize = pPa
1c510 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
1c520 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1c530 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1c540 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1c550 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1c560 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1c570 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1c580 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1c590 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1c5a0 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1c5b0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c5c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1c5d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1c5f0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1c610 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1c620 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1c630 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1c640 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1c650 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1c660 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1c670 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1c680 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1c690 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1c6a0 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1c6b0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1c6c0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1c6d0 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1c6e0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1c6f0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1c700 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1c710 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1c720 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1c730 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1c740 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1c750 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1c760 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1c770 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1c780 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1c790 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1c7a0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c7b0 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1c7c0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1c7d0 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1c7e0 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1c7f0 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1c800 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1c810 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1c820 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1c830 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c840 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1c850 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c860 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c870 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c880 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c890 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1c8a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1c8b0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1c8c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1c8d0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1c8e0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1c8f0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1c900 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1c910 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1c920 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1c930 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1c940 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1c950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c960 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1c970 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1c980 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1c990 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1c9a0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1c9b0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1c9c0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1c9d0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1c9e0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1c9f0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1ca00 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1ca10 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1ca20 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1ca30 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1ca40 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1ca50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1ca60 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1ca70 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1ca80 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1ca90 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1caa0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1cab0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1cac0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1cad0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1cae0 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1caf0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1cb00 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1cb10 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1cb20 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1cb30 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1cb40 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1cb50 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1cb60 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1cb70 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1cb80 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1cb90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1cba0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cbb0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1cbc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cbd0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1cbe0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cbf0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1cc00 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1cc10 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1cc20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1cc30 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1cc40 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1cc50 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1cc60 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1cc70 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1cc80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1cc90 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1cca0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1ccb0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1ccc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1ccd0 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1cce0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1ccf0 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1cd00 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1cd10 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1cd20 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1cd30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cd40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1cd50 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1cd60 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1cd70 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1cd80 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1cd90 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1cda0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1cdb0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1cdc0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1cdd0 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1cde0 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1cdf0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1ce00 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1ce10 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1ce20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1ce30 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1ce40 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1ce50 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1ce60 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1ce70 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1ce80 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1ce90 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1cea0 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1ceb0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1cec0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ced0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1cee0 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1cef0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1cf00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cf10 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1cf20 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1cf30 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1cf40 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1cf50 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1cf60 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1cf70 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1cf80 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1cf90 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1cfa0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cfb0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1cfc0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1cfd0 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1cfe0 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1cff0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1d000 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1d010 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1d020 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1d030 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1d040 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1d050 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1d060 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1d070 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1d080 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1d090 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1d0a0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1d0b0 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1d0c0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1d0d0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1d0e0 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1d0f0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1d100 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1d110 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d120 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1d130 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d140 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1d150 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1d160 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1d170 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1d180 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1d190 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1d1a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1d1b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1d1c0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1d1d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1d1e0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1d1f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d200 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1d210 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1d220 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1d230 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d240 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1d250 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1d260 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1d270 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1d280 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d2a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d2b0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1d2c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1d2d0 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1d2e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1d2f0 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1d300 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1d310 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1d320 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1d330 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1d340 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1d350 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1d360 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1d370 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1d380 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1d390 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1d3a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1d3b0 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1d3c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1d3d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d3e0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1d3f0 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1d400 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1d410 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1d420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d430 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1d440 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  k++;.      }else
1d450 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
1d460 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1d470 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1d480 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1d490 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
1d4a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1d4b0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1d4c0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1d4d0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1d4e0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1d4f0 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
1d500 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
1d510 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
1d520 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1d530 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
1d540 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
1d550 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
1d560 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
1d570 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
1d580 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
1d590 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
1d5a0 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
1d5b0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1d5c0 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
1d5d0 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
1d5e0 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
1d5f0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
1d600 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
1d610 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
1d620 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
1d630 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
1d640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1d660 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1d670 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1d680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d690 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
1d6a0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1d6b0 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
1d6c0 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
1d6d0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
1d6e0 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1d6f0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
1d700 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
1d710 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
1d720 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
1d730 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
1d740 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
1d750 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
1d760 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
1d770 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
1d780 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
1d790 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
1d7a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1d7b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d7c0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d7e0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
1d7f0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
1d800 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
1d810 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
1d820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d840 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1d850 50 61 67 65 72 2c 20 26 73 61 76 65 64 50 61 67  Pager, &savedPag
1d860 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 7d 0a  eSize, -1);.  }.
1d870 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1d880 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1d890 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1d8a0 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1d8b0 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1d8c0 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1d8d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1d8f0 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1d900 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1d910 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1d920 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1d930 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1d940 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1d950 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1d960 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1d970 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1d980 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d990 0a 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  .  sqlite3OsFile
1d9a0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1d9b0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1d9c0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1d9d0 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ,0);.#endif..  /
1d9e0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1d9f0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1da00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1da10 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1da20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1da30 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1da40 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1da50 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1da60 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1da70 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1da80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1da90 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1daa0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1dab0 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1dac0 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1dad0 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1dae0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1daf0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1db00 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1db10 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1db20 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1db30 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1db40 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1db50 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1db60 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1db70 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1db80 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1db90 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1dba0 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1dbb0 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1dbc0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1dbd0 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1dbe0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1dbf0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1dc00 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1dc10 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1dc20 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1dc30 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1dc40 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1dc50 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1dc60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dc70 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1dc80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1dc90 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1dca0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1dcb0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1dcc0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1dcd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1dce0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1dcf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1dd00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1dd10 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70  LITE_OK.   && (p
1dd20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1dd30 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1dd40 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1dd50 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1dd60 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
1dd70 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1dd80 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
1dd90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dda0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1ddb0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1ddc0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1ddd0 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20  aster[0]!='\0', 
1dde0 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  0);.    testcase
1ddf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1de00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1de10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1de20 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
1de30 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1de40 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
1de50 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
1de60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1de70 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
1de80 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
1de90 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
1dea0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1deb0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
1dec0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
1ded0 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
1dee0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
1def0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1df00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1df10 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c  if( isHot && nPl
1df20 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71  ayback ){.    sq
1df30 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
1df40 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
1df50 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76  ROLLBACK, "recov
1df60 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72  ered %d pages fr
1df70 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  om %s",.        
1df80 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1df90 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  k, pPager->zJour
1dfa0 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nal);.  }..  /* 
1dfb0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
1dfc0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
1dfd0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
1dfe0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
1dff0 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
1e000 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
1e010 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
1e020 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
1e030 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
1e040 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
1e050 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1e060 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
1e070 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
1e080 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
1e090 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e0a0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
1e0b0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
1e0c0 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1e0d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e0e0 28 6f 72 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  (or out of.** th
1e0f0 65 20 57 41 4c 20 69 66 20 74 68 61 74 20 69 73  e WAL if that is
1e100 20 77 68 65 72 65 20 74 68 65 20 6d 6f 73 74 20   where the most 
1e110 72 65 63 65 6e 74 20 63 6f 70 79 20 69 66 20 66  recent copy if f
1e120 6f 75 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70  ound) into .** p
1e130 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1e140 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1e150 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1e160 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e170 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1e180 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e190 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1e1a0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1e1b0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1e1c0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1e1d0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1e1e0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1e1f0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1e200 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e210 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1e220 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1e230 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1e240 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e250 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1e260 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1e270 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1e280 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1e290 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
1e2a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e2b0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1e2c0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1e2d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1e2e0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74  age pPg */.  int
1e2f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e310 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
1e320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e330 5f 57 41 4c 0a 20 20 75 33 32 20 69 46 72 61 6d  _WAL.  u32 iFram
1e340 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1e350 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 6f 66 20      /* Frame of 
1e360 57 41 4c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  WAL containing p
1e370 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  gno */..  assert
1e380 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1e390 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1e3a0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1e3b0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1e3c0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
1e3d0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1e3e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
1e3f0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
1e400 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1e410 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Wal, pPg->pgno, 
1e420 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66  &iFrame);.    if
1e430 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 46 72 61  ;.  }.  if( iFra
1e450 6d 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  me ){.    rc = s
1e460 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61  qlite3WalReadFra
1e470 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e480 20 69 46 72 61 6d 65 2c 70 50 61 67 65 72 2d 3e   iFrame,pPager->
1e490 70 61 67 65 53 69 7a 65 2c 70 50 67 2d 3e 70 44  pageSize,pPg->pD
1e4a0 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  ata);.  }else.#e
1e4b0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34  ndif.  {.    i64
1e4c0 20 69 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d   iOffset = (pPg-
1e4d0 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
1e4e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1e4f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e500 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1e510 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1e520 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1e530 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1e540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1e550 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1e560 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e570 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e580 7d 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  }..  if( pPg->pg
1e590 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1e5a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1e5b0 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1e5c0 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1e5d0 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1e5e0 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1e5f0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1e600 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1e610 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1e620 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1e630 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1e640 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1e650 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1e660 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1e670 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1e680 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1e690 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1e6a0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1e6b0 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1e6c0 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1e6d0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1e6e0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1e6f0 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1e700 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1e710 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1e720 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e730 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1e740 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1e750 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1e760 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1e770 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1e780 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1e790 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1e7a0 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1e7b0 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1e7c0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1e7d0 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1e7e0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1e7f0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1e800 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67  e noise equaling
1e810 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1e820 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1e830 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1e840 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1e850 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1e860 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1e870 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e880 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1e890 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e8a0 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1e8b0 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1e8c0 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1e8d0 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1e8e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1e8f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e900 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1e910 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1e920 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1e930 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1e940 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1e950 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
1e960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1e970 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47  EM_BKPT);..  PAG
1e980 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1e990 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1e9a0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1e9b0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1e9c0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1e9d0 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1e9e0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1e9f0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1ea00 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1ea10 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1ea20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ea30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1ea40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65   pPg->pgno, page
1ea50 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1ea60 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1ea70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1ea80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1ea90 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1eaa0 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1eab0 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1eac0 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1ead0 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1eae0 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1eaf0 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1eb00 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1eb10 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1eb20 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1eb30 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1eb40 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1eb50 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1eb60 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1eb70 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1eb80 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1eb90 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1eba0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1ebb0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1ebc0 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1ebd0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1ebe0 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1ebf0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1ec00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1ec10 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1ec20 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1ec30 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1ec40 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1ec50 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1ec60 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1ec70 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1ec80 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1ec90 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1eca0 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1ecb0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1ecc0 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1ecd0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1ece0 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1ecf0 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1ed00 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1ed10 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1ed20 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1ed30 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1ed40 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1ed50 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1ed60 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1ed70 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1ed80 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1ed90 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1eda0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1edb0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1edc0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1edd0 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1ede0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1edf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ee00 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1ee10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1ee20 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1ee30 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1ee40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1ee50 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1ee60 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1ee70 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1ee80 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1ee90 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1eea0 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1eeb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1eec0 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1eed0 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1eee0 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1eef0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1ef00 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1ef10 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1ef20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1ef30 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1ef40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1ef50 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1ef60 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1ef70 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1ef80 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1ef90 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1efa0 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1efb0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1efc0 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1efd0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1efe0 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1eff0 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1f000 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f010 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1f020 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1f030 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1f040 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1f050 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1f060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f070 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f080 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1f090 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1f0a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1f0b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1f0c0 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1f0d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
1f0e0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f0f0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f100 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
1f110 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
1f120 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
1f130 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1f140 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
1f150 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
1f160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1f170 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
1f180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f190 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1f1a0 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1f1b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f1c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1f1d0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1f1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f1f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f200 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
1f210 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1f220 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1f230 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1f240 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1f250 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1f260 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1f270 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1f280 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1f290 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1f2a0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1f2b0 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1f2c0 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1f2d0 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1f2e0 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1f2f0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1f300 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1f310 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1f320 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1f330 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1f340 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1f350 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1f360 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1f370 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1f380 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1f390 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1f3a0 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1f3b0 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1f3c0 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1f3d0 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1f3e0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1f3f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1f400 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1f410 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1f420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f430 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f440 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1f450 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1f460 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1f470 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1f480 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1f490 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1f4a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f4b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f4d0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1f4e0 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f500 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1f510 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1f520 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1f530 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1f540 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1f550 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1f560 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1f570 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1f580 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1f590 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1f5a0 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1f5b0 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1f5c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1f5d0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1f5e0 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1f5f0 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1f600 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1f610 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1f620 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1f630 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1f640 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1f650 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1f660 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1f670 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1f680 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1f690 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1f6a0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1f6b0 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1f6c0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1f6d0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1f6e0 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1f6f0 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1f700 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1f710 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1f720 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1f730 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1f740 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1f750 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1f760 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1f770 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1f780 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f790 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f7a0 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1f7b0 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1f7c0 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1f7d0 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1f7e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1f7f0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1f800 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1f810 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1f820 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1f830 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1f840 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1f850 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1f860 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1f870 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1f880 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1f890 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1f8a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f8b0 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1f8c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1f8d0 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1f8e0 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1f8f0 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1f900 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1f910 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1f920 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1f930 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1f940 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1f950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1f960 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1f970 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1f9a0 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1f9b0 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9d0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1f9e0 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1f9f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1fa00 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1fa10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fa20 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1fa30 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1fa40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1fa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1fa60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1fa70 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1faa0 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20  s in pList */.  
1fab0 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1fae0 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20  ver pages */..  
1faf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fb00 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1fb10 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1fb20 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1fb30 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1fb40 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1fb50 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1fb60 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1fb70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1fb80 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1fb90 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1fba0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1fbb0 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1fbc0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1fbd0 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1fbe0 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1fbf0 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1fc00 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1fc10 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1fc20 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1fc30 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1fc40 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1fc50 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1fc60 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1fc70 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1fc80 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1fc90 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1fca0 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1fcb0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1fcc0 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1fcd0 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1fce0 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1fcf0 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1fd00 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1fd10 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1fd20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1fd30 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1fd40 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1fd50 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fd60 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1fd70 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1fd80 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1fd90 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1fda0 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1fdb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1fdc0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1fdd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1fde0 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1fdf0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1fe00 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1fe10 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1fe20 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1fe30 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1fe40 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1fe50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1fe60 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1fe70 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1fe80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1fe90 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1fea0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1feb0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1fec0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1fed0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1fee0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1fef0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1ff00 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1ff10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1ff20 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1ff30 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1ff40 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1ff50 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1ff60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ff70 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1ff80 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1ff90 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1ffa0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1ffb0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1ffc0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1ffd0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1ffe0 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1fff0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
20000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
20010 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
20020 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
20030 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20040 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
20050 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
20060 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
20070 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
20080 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
20090 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
200a0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
200b0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
200c0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
200d0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
200e0 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
200f0 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
20100 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
20110 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
20120 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
20130 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
20140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20150 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
20160 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
20170 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
20180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
201a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
201b0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
201d0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
201e0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
201f0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
20200 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20220 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
20230 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
20240 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
20250 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
20260 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
20270 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
20280 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
20290 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
202a0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
202b0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
202c0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
202d0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
202e0 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
202f0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
20300 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
20310 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
20320 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
20330 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
20340 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
20350 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
20360 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
20370 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
20380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
20390 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
203a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
203b0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
203c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
203d0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
203e0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
203f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
20400 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
20410 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
20420 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
20430 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
20440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20450 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
20460 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20470 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
20480 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
20490 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
204a0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
204b0 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
204c0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
204d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
204e0 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
204f0 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
20500 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
20510 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
20520 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
20530 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
20540 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
20550 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
20560 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
20570 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
20580 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
20590 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
205a0 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
205b0 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
205c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
205d0 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
205e0 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
205f0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
20600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20610 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
20620 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
20630 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
20640 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
20650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
20660 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
20670 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
20680 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
20690 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
206a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
206b0 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
206c0 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
206d0 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
206e0 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
206f0 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
20700 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
20710 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
20720 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
20730 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
20740 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
20750 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
20760 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
20770 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
20780 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
20790 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
207a0 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
207b0 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
207c0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
207d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
207e0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
207f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20800 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
20810 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
20820 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
20830 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
20840 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
20850 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50  pFile==0 );.  nP
20860 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
20870 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
20880 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
20890 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
208a0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
208b0 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  se is not availa
208c0 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ble from the.  *
208d0 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  * WAL sub-system
208e0 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  , determine the 
208f0 70 61 67 65 20 63 6f 75 6e 74 20 62 61 73 65 64  page count based
20900 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   on the size of.
20910 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
20920 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  e file.  If the 
20930 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20940 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
20950 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
20960 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
20970 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e   page-size, roun
20980 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e  d up the result.
20990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
209a0 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  e==0 && ALWAYS(i
209b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
209c0 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  )) ){.    i64 n 
209d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
209e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
209f0 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
20a00 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  tes */.    int r
20a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
20a20 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
20a30 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28 20 72  , &n);.    if( r
20a40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20a60 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
20a70 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
20a80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
20a90 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
20aa0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
20ab0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
20ac0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20ad0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
20ae0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
20af0 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
20b00 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
20b10 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
20b20 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
20b30 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
20b40 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
20b50 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
20b60 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
20b70 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
20b80 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
20b90 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
20ba0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
20bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20bc0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
20bd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
20be0 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
20bf0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
20c00 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
20c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
20c20 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
20c30 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
20c40 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20c50 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
20c60 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
20c70 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
20c80 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
20c90 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
20ca0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
20cb0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
20cc0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20cd0 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
20ce0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
20cf0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
20d00 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
20d10 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
20d20 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
20d30 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
20d40 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
20d50 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
20d60 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
20d70 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
20d80 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
20d90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20da0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
20db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
20dc0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
20dd0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
20de0 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
20df0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
20e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
20e10 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
20e20 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
20e30 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
20e40 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
20e50 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
20e60 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
20e70 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
20e80 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
20e90 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
20ea0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
20eb0 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
20ec0 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
20ed0 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
20ee0 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
20ef0 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
20f00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
20f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20f20 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
20f30 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
20f40 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
20f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
20f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20f70 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
20f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20f90 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
20fa0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
20fb0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
20fc0 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
20fd0 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
20fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20ff0 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
21000 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  sts */.    rc = 
21010 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
21020 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21030 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
21040 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
21050 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
21060 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
21070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21080 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
21090 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
210a0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
210b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
210c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
210d0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
210e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
210f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21100 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &nPage);.       
21110 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
21120 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
21130 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
21140 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21150 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
21160 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
21170 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
21180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
211a0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
211b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
211c0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
211d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
211e0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
211f0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
21200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21210 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
21220 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
21230 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
21240 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
21250 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
21260 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
21270 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
21280 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
212a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
212b0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
212c0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
212d0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
212e0 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
212f0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
21300 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21310 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
21320 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
21330 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
21340 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
21350 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
21360 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
21370 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
21380 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
21390 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
213a0 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
213b0 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
213c0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
213d0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
213e0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
213f0 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
21400 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
21410 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
21420 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
21430 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
21440 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
21450 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
21460 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
21470 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21480 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
21490 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
214a0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
214b0 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
214c0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
214d0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
214e0 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
214f0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
21500 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
21510 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
21520 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21530 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
21540 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
21550 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21560 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
21570 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
21580 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
21590 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
215a0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
215b0 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
215c0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
215d0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
215e0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
215f0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
21600 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
21610 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
21620 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
21630 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
21640 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
21650 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
21660 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
21670 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
21680 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
21690 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
216a0 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
216b0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
216c0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
216d0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
216e0 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
216f0 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
21700 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
21710 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
21720 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
21730 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
21740 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
21750 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
21760 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
21770 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
21780 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
21790 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
217a0 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
217b0 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
217c0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
217d0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
217e0 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
217f0 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
21800 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
21810 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
21820 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
21830 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
21840 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
21850 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
21860 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
21870 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
21880 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
21890 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
218a0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
218b0 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
218c0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
218d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
218e0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
218f0 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
21900 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
21910 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
21920 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
21930 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
21940 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
21950 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21960 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
21970 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
21980 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
21990 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
219a0 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
219b0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
219c0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
219d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
219e0 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
219f0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
21a00 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
21a10 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
21a20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
21a30 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
21a40 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
21a50 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
21a60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
21a70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21a80 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
21a90 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
21aa0 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
21ab0 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
21ac0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
21ad0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21ae0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
21af0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
21b00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21b10 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
21b20 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
21b30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
21b40 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
21b50 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
21b60 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
21b70 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
21b80 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
21b90 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
21ba0 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
21bb0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
21bc0 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
21bd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21be0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
21bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21c00 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
21c10 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
21c20 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
21c30 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
21c40 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
21c50 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
21c60 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
21c70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
21c80 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
21c90 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
21ca0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
21cb0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
21cc0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
21cd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
21ce0 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
21cf0 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
21d00 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21d10 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
21d20 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
21d30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
21d40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21d50 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
21d60 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21d70 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
21d80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
21d90 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
21da0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
21db0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
21dc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21dd0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
21de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21df0 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
21e00 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
21e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21e20 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
21e30 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
21e40 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
21e50 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
21e60 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
21e70 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
21e80 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
21e90 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
21ea0 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
21eb0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21ec0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21ed0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
21ee0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
21ef0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21f00 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
21f10 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
21f20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
21f30 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
21f40 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
21f50 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
21f60 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
21f70 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
21f80 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
21f90 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
21fa0 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
21fb0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
21fc0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
21fd0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
21fe0 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
21ff0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
22000 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
22010 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
22020 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
22030 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
22040 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
22050 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
22060 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
22070 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
22080 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
22090 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
220a0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
220b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
220c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
220d0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
220e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
220f0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
22100 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
22110 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
22120 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
22130 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22140 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22170 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
22180 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
22190 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
221a0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
221b0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
221c0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
221d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
221e0 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
221f0 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
22200 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
22210 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
22220 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
22230 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
22240 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
22250 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
22260 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
22270 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
22280 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
22290 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
222a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
222b0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
222c0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
222d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
222e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
222f0 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
22300 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
22310 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
22320 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
22330 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
22340 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
22350 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
22360 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
22370 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22380 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
22390 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
223a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
223b0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
223c0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
223d0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
223e0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
223f0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
22400 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
22410 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
22420 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
22430 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
22440 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
22450 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
22460 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
22470 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
22480 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
22490 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
224a0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
224b0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
224c0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
224d0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
224e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
224f0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
22500 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
22510 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
22520 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
22530 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
22540 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
22550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
22560 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
22570 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
22580 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
22590 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
225a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
225b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
225c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
225d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
225e0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
225f0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
22600 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
22610 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
22620 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
22630 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
22640 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
22650 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
22660 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
22670 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
22680 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
22690 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
226a0 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
226b0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
226c0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
226d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
226e0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
226f0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22700 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22710 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
22720 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
22730 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
22740 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
22750 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
22760 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
22770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22780 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
22790 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
227a0 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
227b0 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
227c0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
227d0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
227e0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
227f0 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
22800 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
22810 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
22820 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
22830 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22840 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
22850 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22860 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
22870 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
22880 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
22890 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
228a0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
228b0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
228c0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
228d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
228e0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
228f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
22900 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
22910 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22920 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22930 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22940 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22950 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22960 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22970 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65  g to recycle cle
22980 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61  an and unused pa
22990 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
229a0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
229b0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
229c0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
229d0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
229e0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
229f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22a00 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22a10 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22a20 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
22a30 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
22a40 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
22a50 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
22a60 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67  ing to spill pag
22a70 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  es to journal..*
22a80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22a90 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50  erSetSpillsize(P
22aa0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22ab0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
22ac0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
22ad0 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50  eSetSpillsize(pP
22ae0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22af0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22b00 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46   Invoke SQLITE_F
22b10 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62  CNTL_MMAP_SIZE b
22b20 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
22b30 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d  ent value of szM
22b40 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
22b50 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
22b60 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
22b70 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  er){.#if SQLITE_
22b80 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
22b90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22ba0 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
22bb0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
22bc0 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64  ) && fd->pMethod
22bd0 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
22be0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
22bf0 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d  t64 sz;.    sz =
22c00 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b   pPager->szMmap;
22c10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73  .    pPager->bUs
22c20 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b  eFetch = (sz>0);
22c30 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
22c40 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
22c50 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
22c60 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
22c70 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
22c80 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
22c90 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
22ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22cb0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
22cc0 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
22cd0 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
22ce0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22cf0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22d00 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
22d10 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22d20 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22d30 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
22d40 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
22d50 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
22d60 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
22d70 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
22d80 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
22d90 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
22da0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
22db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
22dc0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
22dd0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
22de0 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
22df0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
22e00 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
22e10 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
22e20 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
22e30 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
22e40 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
22e50 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
22e60 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
22e70 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22e80 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
22e90 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
22ea0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
22eb0 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
22ec0 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
22ed0 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
22ee0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
22ef0 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
22f00 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
22f10 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
22f20 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76  ere are four lev
22f30 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
22f40 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
22f50 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
22f60 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
22f70 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
22f90 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
22fa0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
22fb0 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
22fc0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
22fd0 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
22fe0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
22ff0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
23000 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
23010 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
23020 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
23030 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
23040 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
23050 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
23060 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
23070 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
23080 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
23090 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
230a0 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
230b0 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
230c0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
230e0 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
230f0 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
23100 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
23110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23120 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
23130 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
23140 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
23150 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
23160 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
23170 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
23180 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
23190 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
231a0 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
231b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
231c0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
231e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
231f0 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
23200 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
23210 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
23220 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
23230 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
23240 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
23250 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
23260 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
23270 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
23280 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
23290 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
232a0 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
232b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
232c0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
232d0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
232e0 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
232f0 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
23300 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
23310 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
23320 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52  k..**.**    EXTR
23330 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69  A     This is li
23340 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74  ke FULL except t
23350 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63  hat is also sync
23360 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  s the directory.
23370 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23380 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
23390 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
233a0 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c  al after the rol
233b0 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20  lback.**        
233c0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73        journal is
233d0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a   unlinked..**.**
233e0 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
233f0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
23400 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
23410 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
23420 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
23430 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
23440 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
23450 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
23460 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
23470 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
23480 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
23490 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
234a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
234b0 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
234c0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
234d0 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
234e0 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
234f0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
23500 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
23510 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
23520 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
23530 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
23540 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
23550 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
23560 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
23570 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
23580 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
23590 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
235a0 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
235b0 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
235c0 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
235d0 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
235e0 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
235f0 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72  th NORMAL.  Ther
23600 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
23610 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a  ce between FULL.
23620 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72  ** and EXTRA for
23630 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
23640 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
23650 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
23660 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
23670 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
23680 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23690 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
236a0 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
236b0 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
236c0 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
236d0 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
236e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
236f0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
23700 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
23710 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
23720 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
23730 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
23740 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
23750 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
23760 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
23770 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
23780 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
23790 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
237a0 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
237b0 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
237c0 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
237d0 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
237e0 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
237f0 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
23800 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
23810 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
23820 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
23830 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
23840 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
23850 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
23860 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
23870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23880 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
23890 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
238a0 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
238b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
238c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
238d0 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
238e0 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
238f0 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
23900 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
23910 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
23920 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
23930 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23940 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
23950 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23960 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
23970 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
23980 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
23990 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
239a0 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
239b0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
239c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
239d0 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50  Sync =  level==P
239e0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
239f0 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70  _OFF ?1:0;.    p
23a00 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23a10 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53  = level>=PAGER_S
23a20 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20  YNCHRONOUS_FULL 
23a30 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
23a40 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65  ->extraSync = le
23a50 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23a60 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a  RONOUS_EXTRA ?1:
23a70 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
23a80 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
23a90 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23aa0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
23ab0 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
23ac0 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
23ad0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23ae0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23af0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
23b00 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23b10 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23b20 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23b30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
23b40 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 28  walSyncFlags = (
23b50 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23b60 73 3c 3c 32 29 3b 0a 20 20 69 66 28 20 70 50 61  s<<2);.  if( pPa
23b70 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
23b80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23b90 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 70 50 61  SyncFlags |= pPa
23ba0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
23bb0 20 20 7d 0a 20 20 69 66 28 20 28 70 67 46 6c 61    }.  if( (pgFla
23bc0 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f  gs & PAGER_CKPT_
23bd0 46 55 4c 4c 46 53 59 4e 43 29 20 26 26 20 21 70  FULLFSYNC) && !p
23be0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
23bf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23c00 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 28 53 51  SyncFlags |= (SQ
23c10 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c  LITE_SYNC_FULL<<
23c20 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  2);.  }.  if( pg
23c30 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
23c40 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
23c50 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23c60 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
23c70 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
23c80 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23c90 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
23ca0 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
23cb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
23cc0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
23cd0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
23ce0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
23cf0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
23d00 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
23d10 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
23d20 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
23d30 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23d40 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
23d50 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
23d60 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
23d70 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
23d80 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
23d90 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
23da0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
23db0 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
23dc0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
23dd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
23de0 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
23df0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23e00 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
23e10 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
23e20 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
23e30 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
23e40 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
23e50 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
23e60 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
23e70 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
23e80 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
23e90 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
23ea0 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
23eb0 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
23ec0 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
23ed0 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
23ee0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
23ef0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
23f00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23f10 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
23f20 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
23f30 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23f40 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
23f50 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
23f60 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
23f70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
23f80 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
23f90 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23fa0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
23fb0 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
23fc0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
23fd0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
23fe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
23ff0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
24000 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
24010 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
24020 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
24030 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24050 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24060 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
24070 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
24080 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
24090 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
240a0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
240b0 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
240c0 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
240d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
240e0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
240f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
24100 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
24110 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
24120 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
24130 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
24140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
24150 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
24160 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
24170 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
24180 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
24190 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
241a0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
241b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
241c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
241d0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
241e0 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
241f0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
24200 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
24210 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
24220 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
24230 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
24240 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
24250 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
24260 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
24270 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
24280 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
24290 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
242a0 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
242b0 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
242c0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
242d0 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
242e0 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
242f0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
24300 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
24310 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
24320 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
24330 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
24340 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
24350 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
24360 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
24370 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24390 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
243a0 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
243b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
243c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
243d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
243e0 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
243f0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
24400 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
24410 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
24420 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
24430 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
24440 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
24450 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
24460 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
24470 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
24480 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
24490 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
244a0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
244b0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
244c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
244d0 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
244e0 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
244f0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
24500 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
24510 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
24520 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
24530 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
24540 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
24550 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
24560 74 42 75 73 79 48 61 6e 64 6c 65 72 28 0a 20 20  tBusyHandler(.  
24570 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
245a0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
245b0 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
245c0 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
245d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
245e0 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
245f0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
24600 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24620 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
24630 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
24640 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 2a   */.){.  void **
24650 61 70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  ap;.  pPager->xB
24660 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
24670 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
24680 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
24690 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
246a0 6c 65 72 41 72 67 3b 0a 20 20 61 70 20 3d 20 28  lerArg;.  ap = (
246b0 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
246c0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
246d0 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a   assert( ((int(*
246e0 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d  )(void *))(ap[0]
246f0 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72  ))==xBusyHandler
24700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   );.  assert( ap
24710 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65  [1]==pBusyHandle
24720 72 41 72 67 20 29 3b 0a 20 20 73 71 6c 69 74 65  rArg );.  sqlite
24730 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
24740 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
24750 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59  QLITE_FCNTL_BUSY
24760 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a  HANDLER, (void *
24770 29 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  )ap);.}../*.** C
24780 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
24790 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
247a0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
247b0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
247c0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
247d0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
247e0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
247f0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24800 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24810 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24820 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
24830 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
24840 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
24850 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
24860 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
24870 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
24880 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
24890 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
248a0 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
248b0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
248c0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
248d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
248e0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
248f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
24900 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
24910 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
24920 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
24930 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
24940 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
24950 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
24960 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
24970 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
24980 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
24990 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
249a0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
249b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
249c0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
249d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
249e0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
249f0 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
24a00 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
24a10 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
24a20 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
24a30 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
24a40 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
24a50 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
24a60 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24a70 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24a80 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
24a90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24aa0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
24ab0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
24ac0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
24ad0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
24ae0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
24af0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24b00 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
24b10 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
24b20 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
24b30 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
24b40 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
24b50 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
24b60 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
24b70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24b80 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24b90 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
24ba0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
24bb0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
24bc0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
24bd0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
24be0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
24bf0 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
24c00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
24c10 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
24c20 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
24c30 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24c40 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24c50 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24c60 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24c70 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24c80 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24c90 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24ca0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24cb0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24cc0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
24cd0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
24ce0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24cf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24d00 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
24d10 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
24d20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
24d30 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24d40 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
24d50 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24d60 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24d70 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24d80 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24d90 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24da0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24db0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24dc0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
24dd0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
24de0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24df0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
24e00 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
24e10 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
24e20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
24e30 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
24e40 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
24e50 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24e60 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24e70 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24e80 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
24e90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
24ea0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
24eb0 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
24ec0 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
24ed0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
24ee0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
24ef0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
24f00 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
24f10 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
24f20 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
24f30 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
24f40 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
24f50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24f60 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
24f70 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24f80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24f90 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
24fa0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
24fb0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
24fc0 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
24fd0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
24fe0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
24ff0 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
25000 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
25010 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
25020 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
25030 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
25040 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
25050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
25060 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
25070 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
25080 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
25090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
250a0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
250b0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
250c0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
250d0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
250e0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
250f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25100 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
25110 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25120 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
25130 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
25140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
25150 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
25160 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25170 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
25180 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
251a0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
251b0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
251c0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
251d0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
251e0 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
251f0 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
25200 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
25210 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
25220 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
25230 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
25240 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
25250 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
25260 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
25270 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
25280 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
25290 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
252a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
252b0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
252c0 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
252d0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
252e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
252f0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
25300 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
25310 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
25320 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
25330 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
25340 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
25350 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
25360 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
25370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25390 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
253a0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
253b0 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
253c0 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
253d0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
253e0 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
253f0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
25400 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
25410 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
25420 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
25430 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
25440 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
25450 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
25460 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
25470 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
25480 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
25490 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
254a0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
254b0 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
254c0 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
254d0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
254e0 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
254f0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
25500 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
25510 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
25520 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
25530 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
25540 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
25550 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
25560 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
25570 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
25580 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
25590 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
255a0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
255b0 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
255c0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
255d0 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
255e0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
255f0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
25600 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
25610 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
25620 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
25630 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
25640 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
25650 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25660 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
25670 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
25680 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
25690 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
256a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
256b0 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
256c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
256d0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
256e0 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
256f0 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
25700 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
25710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25720 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
25730 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
25740 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
25750 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
25760 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
25770 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
25780 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
25790 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
257a0 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
257b0 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
257c0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
257d0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
257e0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
257f0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
25800 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
25810 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
25820 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
25830 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
25840 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
25850 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
25860 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
25870 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
25880 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
25890 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
258a0 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
258b0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
258c0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
258d0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
258e0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
258f0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
25900 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
25910 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25920 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25930 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
25940 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25950 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
25960 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25970 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
25980 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25990 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
259a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
259b0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
259c0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
259d0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
259e0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
259f0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
25a00 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
25a10 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
25a20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
25a30 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
25a40 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
25a50 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
25a60 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
25a70 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
25a80 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
25a90 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
25aa0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
25ab0 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
25ac0 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
25ad0 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
25ae0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
25af0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
25b00 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
25b10 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
25b20 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25b30 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
25b40 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
25b50 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
25b60 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25b70 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
25b80 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
25b90 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
25ba0 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
25bb0 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
25bc0 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
25bd0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
25be0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
25bf0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
25c00 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
25c10 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
25c20 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
25c30 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
25c40 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
25c50 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25c60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25c70 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25c80 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25ca0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25cb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25cc0 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
25cd0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
25ce0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25cf0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
25d00 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
25d10 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
25d20 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
25d30 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
25d40 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
25d50 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25d60 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
25d70 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25d80 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
25d90 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
25da0 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
25db0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
25dc0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
25dd0 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
25de0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25df0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25e00 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
25e10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25e20 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
25e30 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
25e40 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
25e50 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
25e60 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25e70 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25e90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25ea0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
25eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25ee0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
25ef0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
25f00 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
25f10 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
25f20 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
25f30 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
25f40 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
25f50 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
25f60 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
25f70 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25f80 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
25f90 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
25fa0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25fb0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
25fc0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
25fd0 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
25fe0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
25ff0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
26000 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
26010 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
26020 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26030 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
26040 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26050 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
26060 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
26070 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
26080 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
26090 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
260a0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
260b0 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
260c0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
260d0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
260e0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
260f0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
26100 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
26110 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26120 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
26130 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
26140 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
26150 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
26160 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
26170 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
26180 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
26190 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
261a0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
261b0 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
261c0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
261d0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
261e0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
261f0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
26200 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
26210 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
26220 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
26230 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
26240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26250 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
26260 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
26270 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
26280 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
26290 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
262a0 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
262b0 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
262c0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
262d0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
262e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
262f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26300 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
26310 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
26320 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
26330 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26360 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
26370 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
26380 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
26390 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
263a0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
263b0 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
263c0 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
263d0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
263e0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
263f0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
26400 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
26410 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
26420 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
26430 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
26440 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
26450 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
26460 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
26470 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
26480 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26490 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
264a0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
264b0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
264c0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
264d0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
264e0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
264f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
26500 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
26510 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
26520 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
26530 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
26540 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
26550 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
26560 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
26570 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
26580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26590 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
265a0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
265b0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
265c0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
265d0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
265e0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
265f0 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
26600 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
26610 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
26620 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
26630 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
26640 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
26650 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
26660 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
26670 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
26680 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
26690 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
266a0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
266b0 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
266c0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
266d0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
266e0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
266f0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
26700 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
26710 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26720 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
26730 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
26740 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
26750 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
26760 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
26770 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
26780 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
26790 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
267a0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
267b0 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
267c0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
267d0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
267e0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
267f0 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
26800 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
26810 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
26820 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
26830 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
26840 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
26850 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
26860 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
26870 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
26880 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
26890 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
268a0 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
268b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
268c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
268d0 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
268e0 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
268f0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26900 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
26910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26920 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
26930 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
26940 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
26950 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
26960 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
26970 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
26980 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
26990 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
269a0 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
269b0 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
269c0 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
269d0 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
269e0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
269f0 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
26a00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
26a10 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
26a20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26a30 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
26a40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
26a50 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
26a60 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
26a70 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
26a80 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26a90 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
26aa0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
26ab0 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
26ac0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26ad0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
26ae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26af0 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
26b00 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
26b10 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
26b20 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26b30 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
26b40 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
26b50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26b60 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
26b70 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
26b80 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
26b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
26ba0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
26bb0 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
26bc0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
26bd0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
26be0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26bf0 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
26c00 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
26c10 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
26c20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
26c30 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
26c40 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
26c50 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26c60 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26c70 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26c80 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26c90 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26ca0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26cb0 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26cd0 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
26ce0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26cf0 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
26d00 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
26d10 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
26d20 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
26d30 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
26d40 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
26d50 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
26d60 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
26d70 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26d80 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
26d90 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
26da0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
26db0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
26dc0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
26dd0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
26de0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26df0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26e00 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
26e10 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
26e20 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
26e30 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
26e40 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
26e50 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
26e60 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26e70 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26e80 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
26e90 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
26ea0 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
26eb0 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
26ec0 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
26ed0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
26ee0 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
26ef0 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
26f00 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
26f10 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
26f20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
26f30 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
26f40 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
26f50 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
26f60 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
26f70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26f80 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
26f90 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26fa0 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
26fc0 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
26fd0 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
26fe0 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
26ff0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
27000 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
27010 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
27020 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
27030 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
27040 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
27050 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
27060 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
27070 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
27080 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27090 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
270a0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
270b0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
270c0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
270d0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
270e0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
270f0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
27100 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
27110 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
27120 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27130 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
27140 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
27150 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
27160 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
27170 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
27180 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
27190 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
271a0 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
271b0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
271c0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
271d0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
271e0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
271f0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
27200 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
27210 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
27220 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
27230 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
27240 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
27250 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
27260 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
27270 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
27280 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
27290 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
272a0 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
272b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
272c0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
272d0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
272e0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
272f0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
27300 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
27310 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
27320 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27330 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
27340 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
27350 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
27360 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
27370 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
27380 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
27390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
273a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
273b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
273c0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
273d0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
273e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
273f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27400 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74  SIZE>0./*.** Obt
27410 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
27420 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
27430 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
27440 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
27450 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
27460 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
27470 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
27480 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
27490 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
274a0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
274b0 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
274c0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
274d0 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
274e0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
274f0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
27500 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
27510 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
27520 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
27530 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
27540 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
27550 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
27560 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
27570 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
27580 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
27590 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
275a0 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
275b0 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
275c0 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
275d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
275f0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
27600 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
27630 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
27640 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
27650 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
27660 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
27670 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
27680 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
276a0 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
276b0 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
276c0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
276f0 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
27700 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50  n */.  .  if( pP
27710 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27720 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
27730 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
27740 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
27750 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
27760 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
27770 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
27780 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  irty = 0;.    as
27790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45  sert( pPager->nE
277a0 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d  xtra>=8 );.    m
277b0 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
277c0 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 8);.  }else{
277d0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
277e0 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
277f0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
27800 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
27810 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
27820 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
27830 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
27840 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
27850 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
27860 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
27870 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
27880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27890 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
278a0 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
278b0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
278c0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
278d0 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
278e0 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
278f0 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
27900 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
27910 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
27920 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
27930 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
27940 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
27950 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
27960 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
27970 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
27980 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
27990 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
279a0 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
279b0 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
279c0 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
279d0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
279e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
279f0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
27a00 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
27a10 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27a20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
27a30 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
27a40 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
27a50 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
27a60 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
27a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27a80 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27a90 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
27aa0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
27ab0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
27ac0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
27ad0 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
27ae0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
27af0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
27b00 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27b10 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
27b20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27b30 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
27b40 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
27b50 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27b60 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27b70 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
27b80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27b90 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
27ba0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
27bb0 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
27bc0 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
27bd0 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
27be0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
27bf0 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
27c00 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
27c10 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
27c20 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
27c30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
27c40 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27c50 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
27c60 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
27c70 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
27c80 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
27c90 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
27ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27cb0 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
27cc0 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
27cd0 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
27ce0 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
27cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
27d00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
27d10 73 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74  s still where it
27d20 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
27d30 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
27d40 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
27d50 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
27d60 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
27d70 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
27d80 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
27d90 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
27da0 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
27db0 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
27dc0 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
27dd0 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
27de0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
27df0 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
27e00 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
27e10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
27e20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27e30 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
27e40 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
27e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27e60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27e70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
27e80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
27e90 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
27ea0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
27eb0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
27ec0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
27ed0 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
27ee0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
27ef0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
27f00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
27f10 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
27f20 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
27f30 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
27f40 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
27f50 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
27f60 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
27f70 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
27f80 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
27f90 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
27fa0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
27fb0 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
27fc0 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
27fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
27fe0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
27ff0 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
28000 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
28010 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
28020 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
28030 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
28040 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
28050 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
28060 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
28070 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
28080 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
28090 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
280a0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
280b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
280c0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
280d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
280e0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
280f0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
28100 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
28110 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
28120 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
28130 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
28140 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
28150 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
28160 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
28170 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
28180 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
28190 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
281a0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
281b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
281c0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
281d0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
281e0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
281f0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
28200 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
28210 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
28220 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
28230 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
28240 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
28250 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
28260 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
28270 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
28280 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
28290 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
282a0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
282b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
282c0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38  lite3 *db){.  u8
282d0 20 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50   *pTmp = (u8*)pP
282e0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
282f0 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c  .  assert( db ||
28300 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
28310 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
28320 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
28330 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
28340 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
28350 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
28360 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
28370 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
28380 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
28390 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
283a0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
283b0 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
283c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
283d0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
283e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
283f0 20 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20    {.    u8 *a = 
28400 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  0;.    assert( d
28410 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61  b || pPager->pWa
28420 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
28430 64 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c  db && 0==(db->fl
28440 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43  ags & SQLITE_NoC
28450 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20  kptOnClose) .   
28460 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d    && SQLITE_OK==
28470 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
28480 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b  d(pPager).    ){
28490 0a 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b  .      a = pTmp;
284a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
284b0 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
284c0 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61  r->pWal, db, pPa
284d0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
284e0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
284f0 69 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67  ize,a);.    pPag
28500 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20  er->pWal = 0;.  
28510 7d 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  }.#endif.  pager
28520 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
28530 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
28540 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
28550 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
28560 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
28570 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
28580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
28590 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
285a0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
285b0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
285c0 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
285d0 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
285e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
285f0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
28600 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
28610 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
28620 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
28630 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
28640 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
28650 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
28660 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
28670 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
28680 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
28690 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
286a0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
286b0 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
286c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
286d0 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
286e0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
286f0 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
28700 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
28710 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
28720 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
28730 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
28740 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28750 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
28760 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
28770 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
28780 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
28790 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
287a0 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
287b0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
287c0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
287d0 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
287e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
287f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28800 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28810 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
28820 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28830 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
28840 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
28850 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
28860 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28870 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
28880 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
28890 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
288a0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
288b0 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
288c0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
288d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
288e0 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
288f0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
28900 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
28910 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
28920 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
28930 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
28940 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
28950 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
28960 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28970 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
28980 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
28990 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
289a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
289b0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
289c0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
289d0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
289e0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
289f0 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
28a00 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
28a10 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
28a20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
28a30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
28a40 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
28a50 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
28a60 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
28a70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
28a80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
28a90 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
28aa0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
28ab0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
28ac0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
28ad0 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
28ae0 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
28af0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
28b00 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
28b10 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
28b20 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
28b30 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
28b40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
28b50 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
28b60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
28b70 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
28b80 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
28b90 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
28ba0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
28bb0 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
28bc0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
28bd0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
28be0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
28bf0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
28c00 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
28c10 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
28c20 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
28c30 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
28c40 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
28c50 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
28c60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
28c70 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
28c80 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
28c90 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
28ca0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28cb0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
28cc0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
28cd0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
28ce0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
28cf0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
28d00 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
28d10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
28d20 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
28d30 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
28d40 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
28d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28d60 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
28d70 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
28d80 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
28d90 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
28da0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
28db0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
28dc0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
28dd0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
28de0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
28df0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
28e00 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
28e10 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
28e20 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
28e30 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
28e40 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
28e50 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
28e60 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
28e70 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
28e80 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
28e90 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
28ea0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
28eb0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
28ec0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
28ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28ee0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
28ef0 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
28f00 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
28f10 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
28f20 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
28f30 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
28f40 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
28f50 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
28f60 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
28f70 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
28f80 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
28f90 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
28fa0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
28fb0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
28fc0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
28fd0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
28fe0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
28ff0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
29000 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
29010 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
29020 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
29030 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
29040 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
29050 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
29060 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
29070 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
29080 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
29090 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
290a0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
290b0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
290c0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
290d0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
290e0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
290f0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
29100 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
29110 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
29120 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29130 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
29140 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29150 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
29160 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
29170 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
29180 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
291a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
291b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
291c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
291d0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
291e0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
291f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
29200 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
29210 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29220 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29230 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
29240 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29250 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
29260 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
29270 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
29280 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
29290 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
292a0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
292b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
292c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
292d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
292e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
292f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
29300 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29310 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
29320 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
29330 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
29340 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
29350 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
29360 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
29370 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
29380 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29390 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
293a0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
293b0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
293c0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
293d0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
293e0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
293f0 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
29400 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
29410 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
29420 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
29430 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
29440 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
29450 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
29460 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
29470 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
29480 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
29490 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
294a0 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
294b0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
294c0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
294d0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
294e0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
294f0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
29500 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
29510 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
29520 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
29530 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
29540 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
29550 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
29560 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
29570 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
29580 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
29590 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
295a0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
295b0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
295c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
295d0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
295e0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
295f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29600 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
29610 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
29620 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
29630 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
29640 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
29650 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
29660 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
29670 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
29680 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
29690 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
296a0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
296b0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
296c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
296d0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
296e0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
296f0 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
29700 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
29710 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
29720 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
29730 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
29740 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29750 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29760 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
29770 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
29780 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
29790 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
297a0 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
297b0 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
297c0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
297d0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
297e0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
297f0 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
29800 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
29810 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
29820 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29830 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
29840 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
29850 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
29860 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
29870 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
29880 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
29890 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
298a0 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
298b0 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
298c0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
298d0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
298e0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
298f0 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
29900 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
29910 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
29920 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
29930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29940 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
29950 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
29960 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
29970 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
29980 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29990 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
299a0 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
299b0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
299c0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
299d0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
299e0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
299f0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
29a00 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
29a10 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
29a20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
29a30 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
29a40 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
29a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29a60 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
29a70 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
29a80 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
29a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
29ab0 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
29ac0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
29ad0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
29ae0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
29af0 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
29b00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29b10 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
29b20 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
29b30 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
29b40 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
29b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
29b70 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
29b80 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
29b90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29ba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
29bb0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
29bc0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
29bd0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29be0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
29bf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
29c00 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
29c10 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
29c20 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
29c30 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
29c40 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
29c50 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
29c60 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
29c70 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29c80 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
29c90 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
29ca0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
29cb0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
29cc0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
29cd0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
29ce0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
29cf0 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
29d00 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
29d10 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
29d20 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
29d30 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
29d40 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
29d50 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
29d60 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
29d70 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
29d80 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
29d90 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
29da0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
29db0 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
29dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
29dd0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
29de0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
29df0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
29e00 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
29e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29e20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
29e30 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
29e40 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
29e50 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
29e60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29e70 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
29e80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29e90 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
29ea0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
29eb0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
29ec0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
29ed0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
29ee0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
29ef0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
29f00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
29f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29f20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29f30 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
29f40 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
29f50 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
29f60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29f70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
29f80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29f90 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
29fa0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
29fb0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
29fc0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
29fd0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
29fe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a010 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
2a020 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
2a030 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
2a040 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2a050 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
2a060 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
2a070 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a080 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2a090 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
2a0a0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
2a0b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2a0c0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
2a0d0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2a0e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
2a0f0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2a100 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
2a110 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
2a120 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
2a130 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2a140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a150 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a160 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
2a170 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a180 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a190 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
2a1a0 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
2a1b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
2a1c0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
2a1d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2a1e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
2a1f0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
2a200 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
2a210 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a220 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a230 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
2a250 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2a260 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2a270 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
2a280 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
2a290 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
2a2a0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
2a2b0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
2a2c0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
2a2d0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
2a2e0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
2a2f0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2a300 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
2a310 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
2a320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2a330 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
2a340 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2a350 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
2a360 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
2a370 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
2a380 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2a390 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2a3a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a3b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a3c0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2a3d0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
2a3e0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
2a3f0 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
2a400 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
2a410 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
2a420 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2a430 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
2a440 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
2a450 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
2a460 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
2a470 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2a480 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
2a490 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
2a4a0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
2a4b0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
2a4c0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2a4d0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
2a4e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
2a4f0 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
2a500 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
2a510 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
2a520 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
2a530 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
2a540 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
2a550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a560 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
2a570 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
2a580 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2a590 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
2a5a0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
2a5b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
2a5c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a5d0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
2a5e0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2a5f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
2a600 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2a610 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
2a620 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
2a630 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
2a640 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
2a650 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
2a660 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
2a670 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
2a680 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
2a690 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
2a6a0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
2a6b0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
2a6c0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
2a6d0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
2a6e0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
2a6f0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2a700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a710 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
2a720 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
2a730 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
2a740 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
2a750 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2a760 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
2a770 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
2a780 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
2a790 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2a7a0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
2a7b0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
2a7c0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
2a7d0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
2a7e0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
2a7f0 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
2a800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2a810 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
2a820 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
2a830 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
2a840 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
2a850 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
2a860 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
2a870 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
2a880 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
2a890 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
2a8a0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
2a8b0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
2a8c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2a8d0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
2a8e0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2a8f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2a900 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2a910 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2a920 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
2a930 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2a940 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
2a950 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
2a960 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
2a970 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
2a980 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2a990 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2a9a0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
2a9b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
2a9c0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
2a9d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a9e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a9f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2aa00 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2aa10 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2aa20 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
2aa30 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
2aa40 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
2aa50 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2aa60 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2aa70 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
2aa80 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2aa90 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  le || pPager->eS
2aaa0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2aab0 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
2aac0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
2aad0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
2aae0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2aaf0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ab00 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44  fd) || pList->pD
2ab10 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
2ab20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
2ab30 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
2ab40 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2ab50 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
2ab60 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
2ab70 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
2ab80 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
2ab90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2aba0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
2abb0 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
2abc0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2abd0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
2abe0 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
2abf0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
2ac00 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
2ac10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ac20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
2ac30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2ac40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2ac50 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2ac60 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2ac70 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
2ac80 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
2ac90 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
2aca0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
2acb0 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
2acc0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
2acd0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
2ace0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
2acf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2ad00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2ad10 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2ad20 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
2ad30 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2ad40 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
2ad50 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
2ad60 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
2ad70 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
2ad80 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
2ad90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2ada0 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
2adb0 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
2adc0 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
2add0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
2ade0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2adf0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
2ae00 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2ae10 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
2ae20 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
2ae30 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
2ae40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2ae50 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
2ae60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2ae70 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
2ae80 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
2ae90 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
2aea0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
2aeb0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
2aec0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
2aed0 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
2aee0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
2aef0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
2af00 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
2af10 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
2af20 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
2af30 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
2af40 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
2af50 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
2af60 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
2af70 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
2af80 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
2af90 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
2afa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
2afb0 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
2afc0 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
2afd0 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
2afe0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
2aff0 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
2b000 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
2b010 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
2b020 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2b030 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
2b040 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
2b050 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
2b060 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
2b070 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
2b080 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
2b090 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
2b0a0 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
2b0b0 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
2b0c0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2b0f0 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
2b100 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
2b110 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
2b120 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b130 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b140 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
2b150 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
2b160 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
2b170 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
2b180 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
2b190 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
2b1a0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
2b1b0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
2b1c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b1d0 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29  MEM_BKPT, pData)
2b1e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
2b1f0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
2b200 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
2b210 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2b220 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
2b230 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
2b240 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
2b250 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
2b260 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
2b270 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
2b280 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
2b290 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
2b2a0 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
2b2b0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
2b2c0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
2b2d0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
2b2e0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
2b2f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b300 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
2b310 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
2b320 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b330 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
2b340 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2b350 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2b360 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
2b370 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
2b380 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2b390 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
2b3a0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
2b3b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2b3c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b3d0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
2b3e0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2b3f0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
2b400 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
2b410 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
2b420 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
2b430 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
2b440 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
2b450 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
2b460 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
2b470 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2b480 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
2b490 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
2b4a0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b4b0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2b4c0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4e0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2b4f0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
2b500 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
2b510 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2b520 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
2b530 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
2b540 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
2b550 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
2b560 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
2b570 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b580 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b590 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
2b5a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b5b0 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
2b5c0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
2b5d0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
2b5e0 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
2b5f0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2b600 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
2b620 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
2b630 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2b640 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
2b650 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
2b660 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
2b670 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2b680 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2b690 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
2b6a0 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
2b6b0 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
2b6c0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
2b6d0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2b6e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2b6f0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2b700 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2b710 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b720 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2b730 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2b740 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b750 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2b760 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2b770 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ) ){.    const i
2b780 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49  nt flags =  SQLI
2b790 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2b7a0 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL | SQLITE_OPEN
2b7b0 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20  _READWRITE .    
2b7c0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2b7d0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
2b7e0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a  OPEN_EXCLUSIVE .
2b7f0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2b800 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2b810 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74  E;.    int nStmt
2b820 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
2b830 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
2b840 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
2b850 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2b860 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b870 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
2b880 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
2b890 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70  ){.      nStmtSp
2b8a0 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ill = -1;.    }.
2b8b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b8c0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2b8d0 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61  er->pVfs, 0, pPa
2b8e0 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73  ger->sjfd, flags
2b8f0 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20  , nStmtSpill);. 
2b900 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b910 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2b920 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2b930 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2b940 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2b950 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2b960 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2b970 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2b980 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2b990 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2b9a0 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2b9b0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2b9c0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2b9d0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2b9e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2b9f0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2ba00 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2ba10 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2ba20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2ba30 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2ba40 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2ba50 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2ba60 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2ba70 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2ba80 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2ba90 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2baa0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2bab0 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2bac0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2bad0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2bae0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2baf0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2bb00 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2bb10 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2bb20 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2bb30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bb40 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2bb50 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2bb60 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2bb70 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2bb80 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2bb90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2bba0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2bbb0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2bbc0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2bbd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2bbe0 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2bbf0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2bc00 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2bc10 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2bc20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2bc30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2bc40 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2bc50 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2bc60 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2bc70 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2bc80 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2bc90 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2bca0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2bcb0 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2bcc0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2bcd0 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2bce0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2bcf0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2bd00 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2bd10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2bd20 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2bd30 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2bd40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bd50 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2bd60 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2bd70 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2bd80 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2bd90 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2bda0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2bdb0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2bdc0 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  2;..#if SQLITE_H
2bdd0 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20  AS_CODEC   .    
2bde0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
2bdf0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2be00 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2be10 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2be20 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2be30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2be40 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
2be50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2be60 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20  .      pData2 = 
2be70 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47  pData;.      PAG
2be80 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
2be90 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2bea0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2beb0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2bec0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
2bed0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2bee0 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
2bef0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2bf00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bf10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bf20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2bf30 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
2bf40 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2bf50 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2bf60 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
2bf70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2bf80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bf90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2bfa0 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
2bfb0 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2bfc0 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
2bfd0 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
2bfe0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2bff0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c000 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c010 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2c020 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2c030 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29  ired(PgHdr *pPg)
2c040 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75  {.  if( subjRequ
2c050 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2c060 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a  .    return subj
2c070 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2c080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2c090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c0a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2c0b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c0c0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2c0d0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2c0e0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2c0f0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2c100 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2c110 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2c120 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2c130 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2c140 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2c150 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2c160 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2c170 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2c180 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2c190 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2c1a0 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2c1b0 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2c1c0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2c1d0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2c1e0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2c1f0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2c200 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2c210 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c220 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2c230 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2c240 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2c250 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2c260 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2c270 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2c280 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2c290 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2c2a0 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2c2b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2c2c0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2c2d0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2c2e0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2c2f0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2c300 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2c310 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2c320 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2c330 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2c340 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2c350 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2c360 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2c370 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2c380 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2c390 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2c3a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c3b0 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2c3c0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2c3d0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2c3e0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2c3f0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2c400 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2c410 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2c420 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2c430 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2c440 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2c450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2c460 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2c470 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2c480 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c490 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2c4a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c4b0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2c4c0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2c4d0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2c4e0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c4f0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2c500 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2c510 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2c520 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2c530 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2c540 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2c550 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2c560 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2c570 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2c580 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2c590 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2c5a0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2c5b0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2c5c0 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2c5d0 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2c5e0 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2c5f0 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2c600 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2c610 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2c620 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2c630 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2c640 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2c650 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2c660 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2c670 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2c680 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2c690 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2c6a0 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2c6b0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2c6c0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2c6d0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2c6e0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2c6f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2c700 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2c710 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2c720 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2c730 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2c740 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2c750 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2c760 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2c770 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2c780 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2c790 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2c7a0 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2c7b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2c7c0 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2c7d0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2c7e0 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2c7f0 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2c800 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2c810 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2c820 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2c830 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2c840 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2c850 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2c860 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2c870 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2c880 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2c890 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2c8a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2c8b0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2c8c0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2c8d0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2c8e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2c8f0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c900 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2c910 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2c920 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2c930 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2c940 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2c950 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c960 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2c970 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c980 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2c990 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2c9a0 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2c9b0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2c9c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2c9d0 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2c9e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c9f0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74  }..  pPager->aSt
2ca00 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 53 50  at[PAGER_STAT_SP
2ca10 49 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70  ILL]++;.  pPg->p
2ca20 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
2ca30 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2ca40 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
2ca50 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2ca60 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2ca70 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2ca80 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2ca90 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2caa0 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2cab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2cad0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2cae0 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2caf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2cb00 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
2cb10 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
2cb20 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2cb30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
2cb40 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
2cb50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2cb60 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2cb70 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2cb80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cb90 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65 72  K ) return pager
2cba0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2cbb0 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  c);.    }.#endif
2cbc0 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
2cbd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cbe0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2cbf0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
2cc00 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2cc10 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
2cc20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2cc30 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2cc40 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
2cc50 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2cc60 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2cc70 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
2cc80 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2cc90 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
2cca0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2ccb0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2ccc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ccd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2cce0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2ccf0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2cd00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2cd10 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2cd20 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
2cd30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2cd40 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
2cd50 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
2cd60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cd70 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2cd80 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
2cd90 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2cda0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2cdb0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
2cdc0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2cdd0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
2cde0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2cdf0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
2ce00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
2ce10 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64  all unreferenced
2ce20 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2ce30 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
2ce40 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50  ite3PagerFlush(P
2ce50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ce60 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
2ce70 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
2ce80 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50   !MEMDB ){.    P
2ce90 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
2cea0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2ceb0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2cec0 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ache);.    asser
2ced0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2cee0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2cef0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2cf00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2cf10 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  st ){.      PgHd
2cf20 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
2cf30 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
2cf40 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d  if( pList->nRef=
2cf50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2cf60 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28   = pagerStress((
2cf70 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c  void*)pPager, pL
2cf80 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
2cf90 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
2cfa0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2cfb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2cfc0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2cfd0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2cfe0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2cff0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2d000 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2d010 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2d020 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2d030 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2d040 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2d050 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2d060 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2d070 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2d080 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2d090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d0a0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2d0b0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2d0c0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2d0d0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2d0e0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2d0f0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2d100 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2d110 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2d120 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2d130 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2d140 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2d150 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2d160 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d170 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2d180 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2d190 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2d1a0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2d1b0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2d1c0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2d1d0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2d1e0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2d1f0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2d200 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2d210 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2d220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2d230 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2d240 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2d250 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2d260 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2d270 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2d280 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2d290 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2d2a0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2d2b0 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65   API.  When a ne
2d2c0 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  w page is alloca
2d2d0 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73  ted, the.** firs
2d2e0 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 69  t 8 bytes of thi
2d2f0 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f  s space are zero
2d300 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61 69  ed but the remai
2d310 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61  nder is uninitia
2d320 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65  lized..** (The e
2d330 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75 73  xtra space is us
2d340 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20 74  ed by btree as t
2d350 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2d360 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  t.).**.** The fl
2d370 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2d380 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2d390 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2d3a0 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2d3b0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2d3c0 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2d3d0 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2d3e0 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2d3f0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2d400 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2d410 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2d420 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2d430 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2d440 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2d450 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2d460 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2d470 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2d480 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2d490 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2d4a0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2d4b0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2d4c0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2d4d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2d4e0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2d4f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d500 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2d510 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2d520 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2d530 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2d540 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2d550 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2d560 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2d570 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2d580 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2d590 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2d5a0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2d5b0 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2d5c0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2d5d0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2d5e0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2d5f0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2d600 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2d610 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d620 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2d630 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2d640 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2d650 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2d660 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2d670 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2d680 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2d690 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2d6a0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2d6b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d6c0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2d6d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d6e0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2d6f0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2d700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2d710 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2d720 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2d730 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2d740 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2d750 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2d760 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2d770 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2d780 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2d790 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2d7a0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2d7b0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2d7c0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2d7d0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2d7e0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2d7f0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2d800 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2d810 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2d820 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2d830 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2d840 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2d850 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2d860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d870 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d880 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2d890 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2d8a0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2d8b0 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2d8c0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2d8d0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2d8e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2d8f0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2d900 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2d910 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  le */.#ifdef SQL
2d920 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
2d930 49 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65 6d  IALIZE.  int mem
2d940 4a 4d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  JM = 0;         
2d950 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75 72    /* Memory jour
2d960 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c 73  nal mode */.#els
2d970 65 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a 4d  e.# define memJM
2d980 20 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20   0.#endif.  int 
2d990 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2d9a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d9b0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2d9c0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2d9d0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2d9e0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2d9f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2da00 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2da10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2da20 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2da30 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2da40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2da50 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2da60 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2da70 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2da80 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2da90 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2daa0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2dab0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2dac0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2dad0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2dae0 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2daf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2db00 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2db10 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2db20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2db30 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2db40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2db50 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2db60 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2db70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2db80 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2db90 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2dba0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2dbb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2dbc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2dbd0 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2dbe0 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2dbf0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2dc00 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2dc10 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2dc20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2dc30 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2dc40 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2dc50 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2dc60 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2dc70 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a  ournal).  */.  j
2dc80 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2dc90 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2dca0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2dcb0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2dcc0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2dcd0 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2dce0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2dcf0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2dd00 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2dd10 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2dd20 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2dd30 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2dd40 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2dd50 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2dd60 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2dd70 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2dd80 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2dd90 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2dda0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2ddb0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2ddc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ddd0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2dde0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2ddf0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2de00 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2de10 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2de20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2de30 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2de40 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2de50 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2de60 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2de70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2de80 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2de90 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2dea0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2deb0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2dec0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2ded0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2dee0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2def0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2df00 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2df10 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2df20 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2df30 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2df40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2df50 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2df60 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2df70 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2df80 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2df90 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2dfa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2dfb0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2dfc0 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2dfd0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2dfe0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2dff0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2e000 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2e010 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2e020 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2e030 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2e040 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2e050 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2e060 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2e070 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2e080 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2e090 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2e0a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2e0b0 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2e0c0 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2e0d0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2e0e0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2e0f0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2e100 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2e110 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2e120 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2e130 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2e140 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2e150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e160 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2e170 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2e180 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2e190 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2e1a0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2e1b0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2e1c0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2e1d0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2e1e0 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2e1f0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2e200 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2e210 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2e220 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2e230 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2e240 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2e250 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2e260 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2e270 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2e280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2e290 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2e2a0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2e2b0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2e2c0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2e2d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e2e0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2e2f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2e300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e310 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2e320 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2e330 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2e340 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2e350 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2e360 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2e370 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2e380 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2e390 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2e3a0 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2e3b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2e3c0 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2e3d0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2e3e0 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2e3f0 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2e400 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2e410 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2e420 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2e430 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2e440 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2e450 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2e460 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2e470 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2e480 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2e490 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2e4a0 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2e4b0 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2e4c0 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2e4d0 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2e4e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2e4f0 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2e500 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2e510 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2e520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2e530 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2e540 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2e550 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2e560 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2e580 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2e590 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2e5a0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2e5b0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2e5c0 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2e5d0 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2e5e0 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2e5f0 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2e600 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2e610 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2e620 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2e630 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2e640 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2e650 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2e660 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2e670 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2e680 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2e690 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2e6a0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2e6b0 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2e6c0 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2e6d0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2e6e0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2e6f0 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2e700 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2e710 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2e720 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2e730 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2e740 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2e750 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2e760 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2e770 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2e780 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2e790 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2e7a0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2e7b0 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2e7c0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2e7d0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2e7e0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2e7f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2e800 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e820 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
2e830 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2e840 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2e850 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2e860 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2e870 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2e880 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2e890 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2e8a0 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2e8b0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e8c0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2e8d0 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2e8e0 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2e8f0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2e900 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2e910 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2e920 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2e930 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e940 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2e950 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2e960 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2e970 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2e980 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2e990 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2e9a0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2e9b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2e9c0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2e9d0 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2e9e0 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2e9f0 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2ea00 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2ea10 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2ea20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2ea30 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2ea40 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ea50 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2ea60 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2ea70 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20   1 + nUri);.    
2ea80 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2ea90 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
2eaa0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2eab0 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20  .    if( nUri ) 
2eac0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2ead0 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2eae0 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2eaf0 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2eb00 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2eb10 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2eb20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2eb30 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2eb40 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2eb50 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22  , "-journal\000"
2eb60 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  , 8+2);.    sqli
2eb70 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2eb80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2eb90 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2eba0 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  al);.#ifndef SQL
2ebb0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2ebc0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20   pPager->zWal = 
2ebd0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2ebe0 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d  l[nPathname+8+1]
2ebf0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2ec00 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2ec10 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2ec20 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2ec30 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68  ager->zWal[nPath
2ec40 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30  name], "-wal\000
2ec50 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 4+1);.    sql
2ec60 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2ec70 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2ec80 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2ec90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2eca0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2ecb0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2ecc0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2ecd0 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2ece0 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2ecf0 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2ed00 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2ed10 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2ed20 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2ed30 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2ed40 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2ed60 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2ed70 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2ed80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ed90 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2eda0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2edb0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2edc0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2edd0 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2ede0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
2edf0 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
2ee00 4c 49 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d  LIZE.    memJM =
2ee10 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2ee20 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
2ee30 65 6e 64 69 66 0a 20 20 20 20 72 65 61 64 4f 6e  endif.    readOn
2ee40 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2ee50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2ee60 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  !=0;..    /* If 
2ee70 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2ee80 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2ee90 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2eea0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2eeb0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2eec0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2eed0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2eee0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2eef0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2ef00 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2ef10 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2ef20 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2ef30 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2ef40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ef50 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2ef60 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2ef70 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2ef80 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2ef90 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2efa0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2efb0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2efc0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2efd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2efe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eff0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2f000 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2f010 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2f020 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2f030 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b  if( !readOnly ){
2f040 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74  .        setSect
2f050 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2f060 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2f070 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2f080 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2f090 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2f0a0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
2f0b0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2f0c0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2f0d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
2f0e0 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2f0f0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2f100 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2f110 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2f120 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2f130 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2f140 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2f150 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f160 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2f170 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2f180 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2f190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f1a0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2f1b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2f1c0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
2f1d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2f1e0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
2f1f0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2f200 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2f210 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2f220 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2f230 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2f240 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2f250 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2f260 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2f270 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2f280 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
2f290 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2f2a0 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2f2b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2f2c0 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2f2d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2f2e0 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2f2f0 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2f300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f310 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2f320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2f330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f340 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2f350 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2f360 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69  r->noLock = sqli
2f370 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2f380 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f  zFilename, "nolo
2f390 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ck", 0);.      i
2f3a0 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45  f( (iDc & SQLITE
2f3b0 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45  _IOCAP_IMMUTABLE
2f3c0 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )!=0.       || s
2f3d0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2f3e0 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69  an(zFilename, "i
2f3f0 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b  mmutable", 0) ){
2f400 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c  .          vfsFl
2f410 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2f420 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2f430 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f         goto act_
2f440 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a  like_temp_file;.
2f450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f460 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2f470 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2f480 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2f490 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2f4a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2f4b0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2f4c0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2f4d0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2f4e0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2f4f0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2f500 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2f510 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2f520 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2f530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2f540 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2f550 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2f560 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2f570 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2f580 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2f590 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2f5a0 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2f5b0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2f5c0 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2f5d0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2f5e0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2f5f0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a   journal..    **
2f600 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2f610 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f  nch also runs fo
2f620 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61  r files marked a
2f630 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20  s immutable..   
2f640 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65   */ .act_like_te
2f650 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d  mp_file:.    tem
2f660 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2f670 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2f680 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20  PAGER_READER;   
2f690 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2f6a0 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
2f6b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ock */.    pPage
2f6c0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2f6d0 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a  SIVE_LOCK;    /*
2f6e0 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20   Pretend we are 
2f6f0 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64  in EXCLUSIVE mod
2f700 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  e */.    pPager-
2f710 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20  >noLock = 1;    
2f720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f730 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  o no locking */.
2f740 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2f750 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2f760 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2f770 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2f780 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2f790 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2f7a0 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2f7b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2f7c0 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2f7d0 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2f7e0 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2f7f0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2f800 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2f810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2f820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2f830 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2f840 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f850 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2f860 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2f870 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2f880 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2f890 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2f8a0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
2f8b0 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
2f8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72  _OK ){.    nExtr
2f8e0 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2f8f0 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  a);.    assert( 
2f900 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78  nExtra>=8 && nEx
2f910 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  tra<1000 );.    
2f920 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2f930 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2f940 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2f950 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2f960 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2f970 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2f980 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2f990 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2f9a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2f9b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2f9c0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2f9d0 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72    Pager structur
2f9e0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2f9f0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2fa00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fa10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
2fa20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2fa30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2fa40 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
2fa50 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71  mpSpace);.    sq
2fa60 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2fa70 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2fa80 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
2fa90 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2faa0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2fab0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2fac0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2fad0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2fae0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2faf0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2fb00 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2fb10 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2fb20 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2fb30 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2fb40 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2fb50 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2fb60 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2fb70 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2fb80 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2fb90 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2fba0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fbb0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2fbc0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2fbd0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2fbe0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2fbf0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2fc00 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2fc10 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2fc20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2fc30 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fc40 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2fc50 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2fc60 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2fc70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2fc80 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2fc90 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2fca0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2fcb0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2fcc0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2fcd0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2fce0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2fcf0 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2fd00 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2fd10 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2fd20 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2fd30 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2fd40 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2fd50 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2fd60 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2fd70 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2fd80 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2fd90 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2fda0 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2fdb0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2fdc0 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2fdd0 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2fde0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
2fdf0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2fe00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2fe10 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2fe20 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2fe30 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  ( pPager->extraS
2fe40 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2fe50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2fe60 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2fe70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fe80 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2fe90 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
2fea0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2feb0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
2fec0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
2fed0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
2fee0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2fef0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2ff00 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2ff10 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2ff20 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28  _SYNC_NORMAL | (
2ff30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2ff40 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a  AL<<2);.  }.  /*
2ff50 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2ff60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ff70 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2ff80 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2ff90 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2ffa0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2ffb0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2ffc0 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2ffd0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2ffe0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2fff0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
30000 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
30010 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
30020 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
30030 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
30040 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
30050 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
30060 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
30070 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
30080 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
30090 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
300a0 62 20 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20 20  b || memJM ){.  
300b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
300c0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
300d0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
300e0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
300f0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
30100 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
30110 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
30120 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
30130 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
30140 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65   = xReinit;.  se
30150 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50  tGetterMethod(pP
30160 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73  ager);.  /* mems
30170 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
30180 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
30190 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
301a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d    /* pPager->szM
301b0 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  map = SQLITE_DEF
301c0 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f  AULT_MMAP_SIZE /
301d0 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79  / will be set by
301e0 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a   btree.c */..  *
301f0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
30200 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
30210 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
30220 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30230 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
30240 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
30250 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
30260 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
30270 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
30280 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
30290 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
302a0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
302b0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
302c0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
302d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
302e0 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
302f0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
30300 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
30310 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
30320 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
30330 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
30340 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30350 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
30360 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
30370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30380 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
30390 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
303a0 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
303b0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
303c0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
303d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
303e0 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
303f0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
30400 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
30410 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
30420 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
30430 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
30440 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
30450 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
30460 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
30470 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
30480 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
30490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
304a0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
304b0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
304c0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
304d0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
304e0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
304f0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
30500 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
30510 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
30520 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
30530 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
30540 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
30550 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
30560 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
30570 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
30580 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
30590 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
305a0 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
305b0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
305c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
305d0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
305e0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
305f0 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
30600 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
30610 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
30620 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
30630 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
30640 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30650 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
30660 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
30670 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
30680 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
30690 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
306a0 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
306b0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
306c0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
306d0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
306e0 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
306f0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
30700 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
30710 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
30720 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
30730 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
30740 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
30750 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
30760 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
30770 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
30780 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
30790 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
307a0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
307b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
307c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
307d0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
307e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
307f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
30800 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
30810 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
30820 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
30830 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
30840 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
30850 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
30860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
30870 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
30880 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
30890 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
308a0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
308b0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
308c0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
308d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
308e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
308f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
30900 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
30910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30920 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
30930 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
30940 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
30950 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
30960 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
30970 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
30980 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
30990 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
309a0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
309b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
309c0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
309d0 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
309e0 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
309f0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
30a00 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
30a10 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
30a20 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
30a30 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
30a40 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
30a50 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
30a60 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
30a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
30a80 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
30a90 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
30aa0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
30ab0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
30ac0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30ad0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
30ae0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
30af0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30b00 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
30b10 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
30b20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
30b30 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
30b40 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
30b50 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
30b60 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
30b70 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
30b80 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
30b90 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
30ba0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
30bb0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
30bc0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
30bd0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
30be0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
30bf0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
30c00 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
30c10 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
30c20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
30c30 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
30c40 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
30c50 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
30c60 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
30c70 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
30c80 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
30c90 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
30ca0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
30cb0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
30cc0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
30cd0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
30ce0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
30cf0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
30d00 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
30d10 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
30d20 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
30d30 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
30d40 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
30d50 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
30d60 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
30d70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30d80 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
30d90 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
30da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30db0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
30dc0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
30dd0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
30de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30df0 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20  tempFile==0 );. 
30e00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
30e10 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
30e20 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
30e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30e40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
30e50 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
30e60 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e  is zero pages in
30e70 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e   size, that mean
30e80 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31  s that either (1
30e90 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  ) the.        **
30ea0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65   journal is a re
30eb0 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69  mnant from a pri
30ec0 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68  or database with
30ed0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77   the same name w
30ee0 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
30ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30f00 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f  e but not the jo
30f10 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65  urnal was delete
30f20 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e  d, or (2) the in
30f30 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  itial.        **
30f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
30f50 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65  t populates a ne
30f60 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65  w database is be
30f70 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ing rolled back.
30f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65  .        ** In e
30f90 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20  ither case, the 
30fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
30fb0 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f   be deleted.  Ho
30fc0 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65  wever, take care
30fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
30fe0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
30ff0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
31000 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
31010 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20   due to.        
31020 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ** journal_mode=
31030 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20  PERSIST..       
31040 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
31050 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e  nPage==0 && !jrn
31060 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
31070 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
31080 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
31090 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67           if( pag
310a0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
310b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
310c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
310d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
310e0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
310f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31100 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31110 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
31120 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70  xclusiveMode ) p
31130 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
31140 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
31150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31160 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31170 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
31180 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
31190 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
311a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
311b0 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
311c0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
311d0 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
311e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
311f0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
31200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31210 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
31220 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
31230 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
31240 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
31250 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
31260 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
31270 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
31280 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
31290 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
312a0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
312b0 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
312c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
312d0 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
312e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
312f0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
31300 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
31310 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
31320 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
31330 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
31340 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
31350 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31360 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31370 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31380 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31390 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
313a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
313b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
313c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
313d0 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
313e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
313f0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
31400 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
31410 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
31420 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
31430 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
31440 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
31450 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31480 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
31490 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
314a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
314b0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
314c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
314d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
314e0 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
314f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
31500 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
31510 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
31520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
31530 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
31540 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
31550 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
31560 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
31570 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
31580 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
31590 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
315a0 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
315b0 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
315c0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
315d0 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
315e0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
315f0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
31600 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
31610 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
31620 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
31630 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
31640 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
31650 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
31660 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
31670 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
31680 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
31690 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
316a0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
316b0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
316c0 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
316d0 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
316e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
316f0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
31700 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
31710 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
31720 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
31730 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
31740 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
31750 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
31760 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31770 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
31780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
31790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
317a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
317b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
317c0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
317d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
317e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
317f0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
31800 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
31810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31820 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
31830 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
31840 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e  te3PagerGet() un
31850 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
31860 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
31870 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
31880 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
31890 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
318a0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
318b0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
318c0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
318d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
318e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
318f0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
31900 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
31910 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
31920 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
31930 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
31940 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
31950 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
31960 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
31970 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31980 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
31990 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
319a0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
319b0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
319c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
319d0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
319e0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
319f0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
31a00 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
31a10 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
31a20 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
31a30 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
31a40 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
31a50 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
31a60 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
31a70 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
31a80 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
31a90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
31aa0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
31ab0 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
31ac0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
31ad0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
31ae0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
31af0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
31b00 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
31b10 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
31b20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
31b30 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
31b40 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
31b50 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
31b60 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
31b70 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
31b80 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
31b90 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
31ba0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
31bb0 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
31bc0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
31bd0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
31be0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
31bf0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
31c00 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
31c10 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
31c20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31c30 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
31c40 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
31c50 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
31c60 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
31c70 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
31c80 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
31c90 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
31ca0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
31cb0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
31cc0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
31cd0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
31ce0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
31cf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
31d00 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
31d10 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
31d20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
31d30 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
31d40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31d50 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
31d60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
31d70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31d80 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
31d90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
31da0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
31db0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
31dc0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
31dd0 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
31de0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
31df0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
31e00 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
31e10 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
31e20 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
31e30 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
31e40 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
31e50 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
31e60 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
31e70 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
31e80 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
31e90 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ccess mode.  */.
31ea0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31eb0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
31ec0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
31ed0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
31ee0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
31ef0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
31f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31f10 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31f20 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
31f30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
31f40 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
31f50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
31f60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
31f70 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
31f80 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
31f90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31fa0 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
31fb0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
31fc0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
31fd0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
31fe0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
31ff0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
32000 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
32010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32020 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
32030 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
32040 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
32050 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  OCK );..    rc =
32060 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
32070 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
32080 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
32090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
320a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
320b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
320c0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
320d0 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
320e0 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
320f0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32100 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
32110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
32120 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
32130 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
32140 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
32150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32160 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
32170 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
32180 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
32190 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
321a0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
321b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
321c0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
321d0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
321e0 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
321f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
32200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32210 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
32220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32230 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
32240 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
32250 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
32260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32270 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
32280 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
32290 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
322a0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
322b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
322c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
322d0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
322e0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
322f0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
32300 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
32310 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
32320 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
32330 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
32340 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
32350 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
32360 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
32370 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
32380 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
32390 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
323a0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
323b0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
323c0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
323d0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
323e0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
323f0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
32400 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
32410 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
32420 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
32430 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
32440 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
32450 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
32460 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
32470 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
32480 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
32490 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
324a0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
324b0 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
324c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
324d0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
324e0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
324f0 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
32500 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
32510 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
32520 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
32530 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
32540 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
32550 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
32560 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
32570 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
32580 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
32590 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
325a0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
325b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
325c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
325d0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
325e0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
325f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
32600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32610 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
32620 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
32630 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
32640 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
32650 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
32660 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
32670 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
32680 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
32690 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
326a0 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
326b0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
326c0 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
326d0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
326e0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
326f0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
32700 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
32710 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
32720 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
32730 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
32740 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
32750 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
32760 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
32770 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
32780 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
32790 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
327a0 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
327b0 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
327c0 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
327d0 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
327e0 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
327f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
32800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
32810 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
32820 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
32830 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
32840 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
32850 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
32860 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
32870 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
32880 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
32890 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
328a0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
328b0 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
328c0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
328d0 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
328e0 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
328f0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
32900 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
32910 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
32920 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
32930 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
32940 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
32950 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
32960 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32980 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
32990 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
329a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
329b0 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
329c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
329d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
329e0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
329f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
32a00 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
32a10 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32a20 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
32a30 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
32a40 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
32a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32a60 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
32a70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32a80 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
32a90 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
32aa0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
32ab0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
32ac0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
32ad0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
32ae0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
32af0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32b00 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
32b10 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
32b20 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
32b30 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
32b40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
32b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32b60 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
32b70 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
32b80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32b90 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
32ba0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
32bb0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
32bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
32bd0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
32be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
32bf0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
32c00 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
32c10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32c20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
32c30 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
32c40 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
32c50 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
32c60 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
32c70 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
32c80 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
32c90 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
32ca0 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
32cb0 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
32cc0 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
32cd0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
32ce0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
32cf0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
32d00 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
32d10 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
32d20 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
32d30 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
32d40 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
32d50 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
32d60 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
32d70 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
32d80 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
32d90 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
32da0 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
32db0 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
32dc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
32dd0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
32de0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
32df0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32e00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32e10 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
32e20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32e30 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
32e40 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
32e50 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
32e60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32e80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
32e90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
32ea0 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65  ger, !pPager->te
32eb0 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  mpFile);.       
32ec0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32ed0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
32ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32ef0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
32f00 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32f10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
32f20 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
32f30 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
32f40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
32f50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32f60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32f70 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
32f80 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
32f90 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
32fa0 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
32fb0 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
32fc0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
32fd0 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
32fe0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32ff0 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
33000 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
33010 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
33020 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
33030 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
33040 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
33050 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
33060 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
33070 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
33080 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
33090 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
330a0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
330b0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
330c0 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
330d0 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
330e0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
330f0 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
33100 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
33110 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
33120 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
33130 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
33140 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
33150 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
33160 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
33170 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
33180 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
33190 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
331a0 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
331b0 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
331c0 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
331d0 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
331e0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
331f0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
33200 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
33210 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
33220 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
33230 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
33240 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
33250 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
33260 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
33270 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
33280 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
33290 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
332a0 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
332b0 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
332c0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
332d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
332e0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
332f0 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
33300 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
33310 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
33320 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
33330 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
33340 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
33350 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
33360 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
33370 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
33380 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33390 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
333a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
333b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
333c0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
333d0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
333e0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
333f0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
33400 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
33410 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
33420 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
33430 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67  tempFile && pPag
33440 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33450 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  dLock ){.      /
33460 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
33470 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
33480 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68  acquired then ch
33490 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
334a0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
334b0 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
334c0 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
334d0 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
334e0 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c  ged,.      ** fl
334f0 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
33500 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65  The hasHeldShare
33510 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65  dLock flag preve
33520 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
33530 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
33540 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
33550 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
33560 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
33570 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
33580 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
33590 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
335a0 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
335b0 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
335c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
335d0 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
335e0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
335f0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
33600 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
33610 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
33620 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
33630 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
33640 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
33650 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
33660 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
33670 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
33680 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
33690 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
336a0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
336b0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
336c0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
336d0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
336e0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
336f0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
33700 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
33710 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
33720 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
33730 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
33740 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
33750 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
33760 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
33770 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
33780 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
33790 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
337a0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
337b0 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
337c0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
337d0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
337e0 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49  Vers)];..      I
337f0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
33800 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
33810 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33820 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63  ers)));.      rc
33830 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
33840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
33850 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
33860 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
33870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
33880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33890 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
338a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
338b0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
338c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
338d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
338e0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
338f0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
33900 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
33910 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
33920 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
33930 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
33940 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
33950 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
33960 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
33970 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
33980 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
33990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
339a0 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
339b0 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
339c0 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
339d0 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
339e0 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
339f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
33a00 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
33a10 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
33a20 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
33a30 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
33a40 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
33a50 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
33a60 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
33a70 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
33a80 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
33a90 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
33aa0 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
33ab0 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
33ac0 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
33ad0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
33ae0 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
33af0 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
33b00 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
33b10 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
33b20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
33b30 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
33b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
33b50 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33b60 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
33b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33b80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
33b90 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
33ba0 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
33bb0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
33bc0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
33bd0 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
33be0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
33bf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
33c00 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
33c10 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
33c20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
33c30 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
33c40 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
33c50 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
33c60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33c70 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
33c80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
33c90 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
33ca0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33cb0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
33cc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33cd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
33ce0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
33cf0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
33d00 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
33d10 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26  ->tempFile==0 &&
33d20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33d30 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
33d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33d50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
33d60 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
33d70 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
33d80 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
33d90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
33db0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
33dc0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
33dd0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
33de0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33df0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
33e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
33e10 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33e20 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
33e30 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
33e40 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a  SharedLock = 1;.
33e50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
33e70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
33e80 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
33e90 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
33ea0 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
33eb0 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
33ec0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
33ed0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
33ee0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
33ef0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
33f00 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
33f10 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
33f20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
33f30 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
33f40 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
33f50 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
33f60 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
33f70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
33f80 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
33f90 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
33fa0 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
33fb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
33fc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
33fd0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
33fe0 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Cache)==0 ){.   
33ff0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34000 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20  >nMmapOut==0 ); 
34010 2f 2a 20 62 65 63 61 75 73 65 20 70 61 67 65 31  /* because page1
34020 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
34030 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70   mapped */.    p
34040 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
34050 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
34060 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
34070 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68  page getter meth
34080 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20  ods each try to 
34090 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  acquire a refere
340a0 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65  nce to a.** page
340b0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
340c0 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72  r pgno. If the r
340d0 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
340e0 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
340f0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
34100 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
34110 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
34120 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
34130 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
34140 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65   different imple
34150 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
34160 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20  e getter method 
34170 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
34180 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
34190 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  e of the pager..
341a0 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  **.**     getPag
341b0 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20  eNormal()       
341c0 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c    --  The normal
341d0 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67   getter.**     g
341e0 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20  etPageError()   
341f0 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
34200 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
34210 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
34220 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  e.**     getPage
34230 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20  Mmap()          
34240 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d   --  Used if mem
34250 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69  ory-mapped I/O i
34260 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20  s enabled.**.** 
34270 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
34280 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
34290 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
342a0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
342b0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
342c0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
342d0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
342e0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
342f0 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
34300 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
34310 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
34320 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
34330 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
34340 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
34350 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
34360 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
34370 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
34380 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
34390 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
343a0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
343b0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
343c0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
343d0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
343e0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
343f0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
34400 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
34410 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
34420 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
34430 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
34440 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
34450 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
34460 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
34470 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
34480 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
34490 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
344a0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
344b0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
344c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
344d0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
344e0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
344f0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
34500 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67   if .** the flag
34510 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
34520 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47  ains the PAGER_G
34530 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74  ET_NOCONTENT bit
34540 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
34550 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
34560 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
34570 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
34580 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
34590 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
345a0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
345b0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
345c0 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
345d0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
345e0 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
345f0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
34600 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
34610 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
34620 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
34630 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
34640 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34650 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
34660 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
34670 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
34680 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
34690 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
346a0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
346b0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
346c0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
346d0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
346e0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
346f0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
34700 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
34710 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
34720 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
34730 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
34740 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
34750 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
34760 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41  nal..**.** If PA
34770 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
34780 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  T is true, then 
34790 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
347a0 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
347b0 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
347c0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
347d0 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
347e0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
347f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
34800 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
34810 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
34820 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
34830 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
34840 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
34850 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
34860 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
34870 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
34880 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
34890 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
348a0 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
348b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
348c0 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
348d0 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
348e0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
348f0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
34900 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
34910 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
34920 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
34930 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
34940 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
34950 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
34960 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
34970 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
34980 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
34990 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
349a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
349b0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
349c0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
349d0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
349e0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
349f0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
34a00 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
34a10 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
34a20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
34a30 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
34a40 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
34a50 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34a60 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
34a70 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
34a80 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
34a90 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
34aa0 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
34ab0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
34ac0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
34ad0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
34ae0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
34af0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
34b00 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
34b10 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
34b20 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
34b30 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
34b40 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
34b50 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
34b60 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
34b70 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
34b80 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
34b90 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
34ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
34bb0 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67  ageNormal(.  Pag
34bc0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
34bd0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
34be0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
34bf0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
34c00 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
34c10 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
34c20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
34c30 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
34c40 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
34c50 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
34c60 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
34c70 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
34c80 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
34c90 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
34ca0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34cb0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
34cc0 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20    u8 noContent; 
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ce0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47    /* True if PAG
34cf0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34d00 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c   is set */.  sql
34d10 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
34d20 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65   *pBase;..  asse
34d30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
34d40 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
34d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34d60 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34d70 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
34d80 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
34d90 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
34da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34db0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
34dc0 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
34dd0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
34de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34df0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61  RUPT_BKPT;.  pBa
34e00 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
34e10 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34e20 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
34e30 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d  );.  if( pBase==
34e40 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  0 ){.    pPg = 0
34e50 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
34e60 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72  e3PcacheFetchStr
34e70 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ess(pPager->pPCa
34e80 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73  che, pgno, &pBas
34e90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
34ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34eb0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34ec0 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73  rr;.    if( pBas
34ed0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
34ee0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34ef0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
34f00 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34f10 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rr;.    }.  }.  
34f20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34f30 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34f40 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34f50 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34f60 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74  pBase);.  assert
34f70 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29  ( pPg==(*ppPage)
34f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34f90 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  g->pgno==pgno );
34fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
34fb0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
34fc0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  | pPg->pPager==0
34fd0 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74   );..  noContent
34fe0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
34ff0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
35000 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  !=0;.  if( pPg->
35010 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
35020 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
35030 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
35040 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
35050 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
35060 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
35070 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
35080 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
35090 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
350a0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
350b0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
350c0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
350d0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
350e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
350f0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
35100 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
35110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
35120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
35130 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
35140 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
35150 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
35160 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
35170 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
35180 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f  ed. But first so
35190 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a  me error checks:
351a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
351b0 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  1) The maximum p
351c0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
351d0 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65  31.    ** (2) Ne
351e0 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68  ver try to fetch
351f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
35200 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
35210 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
35220 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
35230 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
35240 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
35250 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35260 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
35270 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35280 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
35290 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
352a0 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  ager;..    asser
352b0 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
352c0 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42  r->fd) || !MEMDB
352d0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
352e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
352f0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
35300 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
35310 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
35320 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
35330 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
35340 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
35350 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
35360 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35380 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
35390 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
353a0 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
353b0 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
353c0 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
353d0 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
353e0 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
353f0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
35400 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
35410 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
35420 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
35430 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
35440 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
35450 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
35460 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
35470 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
35480 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
35490 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
354a0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
354b0 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
354c0 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
354d0 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
354e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
354f0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
35500 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
35510 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
35520 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
35530 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
35540 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
35550 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
35560 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
35570 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
35580 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
35590 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
355a0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
355b0 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
355c0 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
355d0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
355e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
355f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
35610 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
35620 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
35630 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
35640 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
35650 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
35660 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
35670 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
35680 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
35690 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
356a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
356b0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
356c0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
356d0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
356e0 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
356f0 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
35700 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
35710 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
35720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35730 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
35740 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35750 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
35760 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
35770 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
35780 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
35790 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
357a0 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
357b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
357c0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
357d0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
357e0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
357f0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35800 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50  (pPager);.  *ppP
35810 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
35820 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
35830 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
35840 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20  E>0./* The page 
35850 67 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20  getter for when 
35860 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
35870 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  O is enabled */.
35880 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
35890 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20  geMMap(.  Pager 
358a0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
358b0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
358c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
358d0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
358e0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
358f0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
35900 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
35910 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
35920 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
35930 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
35940 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
35950 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
35960 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
35970 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  gs */.){.  int r
35980 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35990 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
359a0 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20  .  u32 iFrame = 
359b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
359c0 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72     /* Frame to r
359d0 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c  ead from WAL fil
359e0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
359f0 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75   acceptable to u
35a00 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  se a read-only (
35a10 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61  mmap) page for a
35a20 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20  ny page except. 
35a30 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68   ** page 1 if th
35a40 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d  ere is no write-
35a50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
35a60 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f   or the ACQUIRE_
35a70 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c  READONLY.  ** fl
35a80 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
35a90 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
35aa0 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74  And so long as t
35ab0 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a  he db is not a .
35ac0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f    ** temporary o
35ad0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
35ae0 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  base.  */.  cons
35af0 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20  t int bMmapOk = 
35b00 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70  (pgno>1.   && (p
35b10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35b20 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28  AGER_READER || (
35b30 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
35b40 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29  T_READONLY)).  )
35b50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53 45  ;..  assert( USE
35b60 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 3b  FETCH(pPager) );
35b70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
35b80 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72  AS_CODEC.  asser
35b90 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  t( pPager->xCode
35ba0 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  c==0 );.#endif..
35bb0 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f    /* Optimizatio
35bc0 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20  n note:  Adding 
35bd0 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65  the "pgno<=1" te
35be0 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d  rm before "pgno=
35bf0 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c  =0" here.  ** al
35c00 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lows the compile
35c10 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72  r optimizer to r
35c20 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73  euse the results
35c30 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22   of the "pgno>1"
35c40 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68  .  ** test in th
35c50 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65  e previous state
35c60 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20  ment, and avoid 
35c70 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20  testing pgno==0 
35c80 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d  in the.  ** comm
35c90 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67  on case where pg
35ca0 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a  no is large. */.
35cb0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26    if( pgno<=1 &&
35cc0 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
35cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
35ce0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
35cf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35d00 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
35d10 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
35d20 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35d30 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35d50 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
35d60 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  dLock==1 );.  as
35d70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
35d80 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
35d90 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70   );..  if( bMmap
35da0 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
35db0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
35dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
35dd0 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
35de0 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
35df0 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  Frame);.    if( 
35e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35e10 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
35e20 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
35e30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
35e40 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
35e50 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
35e60 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30   void *pData = 0
35e70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
35e80 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72  e3OsFetch(pPager
35e90 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28  ->fd, .        (
35ea0 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
35eb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
35ec0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35ed0 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b  e, &pData.    );
35ee0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35ef0 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
35f00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
35f10 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
35f20 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67  R_READER || pPag
35f30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
35f40 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71          pPg = sq
35f50 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
35f60 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
35f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35f80 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
35f90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63      rc = pagerAc
35fa0 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61  quireMapPage(pPa
35fb0 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61  ger, pgno, pData
35fc0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  , &pPg);.      }
35fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
35fe0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
35ff0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
36000 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  (pgno-1)*pPager-
36010 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
36020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36030 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
36040 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
36050 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
36060 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
36070 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  Pg;.        retu
36080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
36090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
360a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
360b0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  K ){.      *ppPa
360c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
360d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
360e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50   }.  return getP
360f0 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72  ageNormal(pPager
36100 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
36110 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  flags);.}.#endif
36120 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
36130 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
36140 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
36150 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65  r method for whe
36160 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  n the pager is a
36170 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  n error state */
36180 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
36190 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65  ageError(.  Page
361a0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
361b0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
361c0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
361d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
361e0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
361f0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
36200 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
36210 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
36220 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
36230 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
36240 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
36250 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
36260 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
36270 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  lags */.){.  UNU
36280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67  SED_PARAMETER(pg
36290 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  no);.  UNUSED_PA
362a0 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
362b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
362c0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
362d0 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67  E_OK );.  *ppPag
362e0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
362f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36300 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68  .}.../* Dispatch
36310 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20   all page fetch 
36320 72 65 71 75 65 73 74 73 20 74 6f 20 74 68 65 20  requests to the 
36330 61 70 70 72 6f 70 72 69 61 74 65 20 67 65 74 74  appropriate gett
36340 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e  er method..*/.in
36350 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  t sqlite3PagerGe
36360 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  t(.  Pager *pPag
36370 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
36380 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
36390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
363a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
363b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
363c0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
363d0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
363e0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
363f0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
36400 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
36410 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
36420 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
36430 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
36440 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  .){.  return pPa
36450 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72  ger->xGet(pPager
36460 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
36470 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  flags);.}../*.**
36480 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
36490 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
364a0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
364b0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
364c0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
364d0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
364e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
364f0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
36500 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
36510 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
36520 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
36530 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36540 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
36550 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
36560 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
36570 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36580 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
36590 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
365a0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
365b0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
365c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
365d0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
365e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
365f0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
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 20 6f 72 20 69  ot in cache or i
36620 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
36630 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
36640 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
36650 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
36660 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
36670 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
36680 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  ){.  sqlite3_pca
36690 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b  che_page *pPage;
366a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
366b0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
366c0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
366d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
366e0 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70  PCache!=0 );.  p
366f0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
36700 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
36710 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
36720 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
36730 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Page==0 || pPage
36740 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
36750 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50  Lock );.  if( pP
36760 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
36770 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  0;.  return sqli
36780 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
36790 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
367a0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67  ache, pgno, pPag
367b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  e);.}../*.** Rel
367c0 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
367d0 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rence..**.** The
367e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
367f0 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ef() and sqlite3
36800 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
36810 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a  l() may only be.
36820 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e  ** used if we kn
36830 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ow that the page
36840 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20   being released 
36850 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
36860 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72  page..** The btr
36870 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20  ee layer always 
36880 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e  holds page1 open
36890 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20   until the end, 
368a0 73 6f 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a  so these first.*
368b0 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61  * to routines ca
368c0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c  n be used to rel
368d0 65 61 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74  ease any page ot
368e0 68 65 72 20 74 68 61 6e 20 42 74 53 68 61 72 65  her than BtShare
368f0 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20  d.pPage1..**.** 
36900 55 73 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  Use sqlite3Pager
36910 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74  UnrefPageOne() t
36920 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e  o release page1.
36930 20 20 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f    This latter ro
36940 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20  utine.** checks 
36950 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
36960 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
36970 70 61 67 65 73 20 61 6e 64 20 69 66 20 74 68 65  pages and if the
36980 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
36990 67 65 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ges reaches zero
369a0 20 69 74 20 64 72 6f 70 73 20 74 68 65 20 64 61   it drops the da
369b0 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  tabase lock..*/.
369c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
369d0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
369e0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45  Page *pPg){.  TE
369f0 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70  STONLY( Pager *p
36a00 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36a10 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28  ger; ).  assert(
36a20 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28   pPg!=0 );.  if(
36a30 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47   pPg->flags & PG
36a40 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20  HDR_MMAP ){.    
36a50 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
36a60 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65  o!=1 );  /* Page
36a70 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72  1 is never memor
36a80 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20  y mapped */.    
36a90 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
36aa0 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
36ab0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  e{.    sqlite3Pc
36ac0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
36ad0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ;.  }.  /* Do no
36ae0 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  t use this routi
36af0 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ne to release th
36b00 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65  e last reference
36b10 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61   to page1 */.  a
36b20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
36b30 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
36b40 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
36b50 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
36b60 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
36b70 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
36b80 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
36b90 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
36ba0 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Pg);.}.void sqli
36bb0 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67  te3PagerUnrefPag
36bc0 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67  eOne(DbPage *pPg
36bd0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
36be0 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
36bf0 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g!=0 );.  assert
36c00 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  ( pPg->pgno==1 )
36c10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
36c20 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
36c30 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50  MMAP)==0 ); /* P
36c40 61 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65  age1 is never me
36c50 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
36c60 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
36c70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  Pager;.  sqlite3
36c80 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69  PagerResetLockTi
36c90 6d 65 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20  meout(pPager);. 
36ca0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
36cb0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61  lease(pPg);.  pa
36cc0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
36cd0 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  d(pPager);.}../*
36ce0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
36cf0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
36d00 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
36d10 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
36d20 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
36d30 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
36d40 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
36d50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
36d60 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
36d70 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
36d80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
36d90 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
36da0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
36db0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
36dc0 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
36dd0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
36de0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
36df0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
36e00 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
36e10 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
36e20 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
36e30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
36e40 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
36e50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36e60 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
36e70 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
36e80 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
36e90 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
36ea0 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
36eb0 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
36ec0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
36ed0 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
36ee0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
36ef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
36f00 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
36f10 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
36f20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
36f30 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
36f40 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
36f50 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
36f60 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
36f70 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
36f80 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
36f90 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
36fa0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
36fb0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
36fc0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
36fd0 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
36fe0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
36ff0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
37000 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
37010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
37020 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
37030 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
37040 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
37050 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
37060 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
37070 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
37080 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
37090 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
370a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
370b0 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
370c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
370d0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
370e0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
370f0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
37100 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
37110 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
37120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37130 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
37140 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
37150 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
37160 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
37170 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
37180 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
37190 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
371a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
371b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
371c0 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
371d0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
371e0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
371f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37200 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
37210 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
37220 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
37230 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
37240 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
37250 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
37260 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
37270 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
37280 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
37290 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
372a0 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
372b0 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
372c0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
372d0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
372e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
372f0 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
37300 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
37310 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37320 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
37330 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
37340 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
37350 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
37360 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
37370 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
37380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
37390 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
373a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
373b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
373c0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
373d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
373e0 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
373f0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
37400 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
37410 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
37420 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
37430 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
37440 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37450 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
37460 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
37470 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
37480 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
37490 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
374a0 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  t flags = SQLITE
374b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
374c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
374d0 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  TE;.        int 
374e0 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  nSpill;..       
374f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
37500 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
37510 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
37520 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
37530 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
37540 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
37550 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69  ;.          nSpi
37560 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
37570 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
37580 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
37590 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
375a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
375b0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
375c0 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72       nSpill = jr
375d0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
375e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
375f0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
37600 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
37610 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
37620 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d  till has the sam
37630 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64  e name as it did
37640 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
37650 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
37660 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  ly opened. */.  
37670 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62        rc = datab
37680 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61  aseIsUnmoved(pPa
37690 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
376a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
376b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
376c0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
376d0 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20  Open (.         
376e0 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
376f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
37700 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
37710 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20   nSpill.        
37720 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
37730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
37740 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
37750 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
37760 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
37770 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
37780 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
37790 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
377a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
377b0 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
377c0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
377d0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
377e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
377f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37800 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
37810 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
37820 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
37830 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
37840 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
37850 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
37860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37870 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
37880 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
37890 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
378a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
378b0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
378c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
378d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
378e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
378f0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
37900 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
37910 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37920 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
37930 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
37940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
37950 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37960 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37970 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
37980 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
37990 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
379a0 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
379b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
379c0 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
379d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
379e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
379f0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
37a00 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
37a10 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
37a20 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
37a30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
37a40 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
37a50 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
37a60 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
37a70 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
37a80 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
37a90 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
37aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37ab0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
37ac0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
37ad0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
37ae0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
37af0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
37b00 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
37b10 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
37b20 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
37b30 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
37b40 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
37b50 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
37b60 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
37b70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
37b80 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
37b90 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
37ba0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
37bb0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
37bc0 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
37bd0 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
37be0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
37bf0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
37c00 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
37c10 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
37c20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
37c30 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
37c40 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
37c50 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
37c60 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
37c70 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
37c80 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
37c90 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
37ca0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
37cb0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
37cc0 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
37cd0 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
37ce0 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
37cf0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
37d00 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
37d10 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
37d20 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
37d30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
37d40 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
37d50 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
37d60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37d70 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
37d80 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
37d90 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37da0 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
37db0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
37dc0 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
37dd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
37de0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
37df0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
37e00 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
37e10 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
37e20 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
37e30 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
37e40 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
37e50 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
37e60 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
37e70 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
37e80 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
37e90 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
37ea0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
37eb0 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
37ec0 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
37ed0 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
37ee0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
37ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
37f00 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
37f10 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
37f20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37f30 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
37f40 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
37f50 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
37f60 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
37f70 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
37f80 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
37f90 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
37fa0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
37fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37fd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37ff0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c  (void)sqlite3Wal
38000 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
38010 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
38020 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
38030 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
38040 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
38050 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
38060 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
38070 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
38080 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
38090 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
380a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
380b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
380c0 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
380d0 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
380e0 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
380f0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
38100 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
38110 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
38120 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
38130 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
38140 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
38150 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
38160 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
38170 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
38180 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
38190 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
381a0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
381b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
381c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
381d0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
381e0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
381f0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
38200 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
38210 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
38220 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
38230 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
38240 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
38250 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
38260 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
38270 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
38280 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
38290 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
382a0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
382b0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
382c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
382d0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
382e0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
382f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
38300 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
38310 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
38320 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
38330 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
38340 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
38350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
38360 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
38380 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
38390 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
383a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
383b0 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
383c0 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
383d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
383e0 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
383f0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
38400 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
38410 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
38420 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
38430 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
38440 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
38450 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
38460 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
38470 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
38480 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
38490 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
384a0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
384b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
384c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
384d0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
384e0 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
384f0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
38500 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
38510 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
38520 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
38530 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
38540 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
38550 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
38560 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
38570 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
38580 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
38590 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
385a0 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
385b0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
385c0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
385d0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
385e0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
385f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
38600 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
38610 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
38620 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
38630 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
38640 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
38650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38660 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
38670 65 3d 3d 50 41 47 45 52 5f 57