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

Artifact 7c999137cb940133f7fc7609ccfa66f17eec4ab4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4e 65 76  0x01      /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
7420: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
7430: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
7440: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
7450: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
7460: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7470: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7480: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7490: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
74f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7500: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
7510: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7520: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
7530: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
7540: 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73  opertion.  Class
7550: 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20   members not in 
7560: 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 65  this block are e
7570: 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a 2a  ither fixed.  **
7580: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
7590: 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65 64  is first created
75a0: 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68   or else only ch
75b0: 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65 20  ange when there 
75c0: 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66  is a.  ** signif
75d0: 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67  icant mode chang
75e0: 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e 67  e (such as chang
75f0: 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69 7a  ing the page_siz
7600: 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c  e, locking_mode,
7610: 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75  .  ** or the jou
7620: 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f  rnal_mode).  Fro
7630: 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c 20  m another view, 
7640: 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  these class memb
7650: 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20 2a  ers describe.  *
7660: 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f 66  * the "state" of
7670: 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69 6c   the pager, whil
7680: 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d 65  e other class me
7690: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20 74  mbers describe t
76a0: 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75  he.  ** "configu
76b0: 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20 70  ration" of the p
76c0: 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20  ager..  */.  u8 
76d0: 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
76e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
76f0: 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20 52  r state (OPEN, R
7700: 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f  EADER, WRITER_LO
7710: 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20  CKED..) */.  u8 
7720: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
7730: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7740: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7760: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
7770: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
7780: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
7790: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
77a0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
77b0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77d0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
77e0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
77f0: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
7800: 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b    u8 doNotSpill;
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7820: 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   Do not spill th
7830: 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e  e cache when non
7840: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73 75  -zero */.  u8 su
7850: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
7860: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7870: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
7880: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
7890: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
78c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
78d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
78e0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
78f0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7900: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7910: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7920: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7940: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7960: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7970: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7980: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7990: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
79a0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
79b0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79d0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
79e0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
79f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7a20: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7a30: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7a40: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7a50: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7a60: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7a70: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7a80: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7a90: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ab0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7ac0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7ad0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7ae0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7af0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7b00: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7b10: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7b20: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7b30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7b40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7b50: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7b60: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7b70: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7b80: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7b90: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ba0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7bb0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7bc0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7bd0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7be0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7bf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7c00: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7c10: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7c20: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7c30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7c40: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7c50: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7c60: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7c70: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7c90: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ca0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7cb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7cc0: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7cd0: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7ce0: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7cf0: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7d00: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7d10: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7d20: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d40: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7d50: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7d60: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7d70: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7d80: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7d90: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7da0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7db0: 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  /..  u8 bUseFetc
7dc0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7dd0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7de0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69 6e  xFetch() */.  in
7df0: 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20  t nMmapOut;     
7e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e10: 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65  ber of mmap page
7e20: 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73  s currently outs
7e30: 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c  tanding */.  sql
7e40: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
7e50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69  p;       /* Desi
7e60: 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70  red maximum mmap
7e70: 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72   size */.  PgHdr
7e80: 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b   *pMmapFreelist;
7e90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
7ea0: 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65  f free mmap page
7eb0: 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74 79   headers (pDirty
7ec0: 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ) */.  /*.  ** E
7ed0: 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e  nd of the routin
7ee0: 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61  ely-changing cla
7ef0: 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a  ss members.  ***
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36  ********/..  u16
7f50: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
7f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
7f70: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
7f80: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
7f90: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20  y page */.  i16 
7fa0: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7fc0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7fd0: 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68  s at end of each
7fe0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
7ff0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
8000: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8010: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
8020: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32  xOpen() */.  u32
8030: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
8040: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
8050: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
8060: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
8070: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
8080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8090: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
80a0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
80b0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80d0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
80e0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
80f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20  tabase */.  i64 
8100: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
8110: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
8120: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
8130: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
8140: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
8150: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
8160: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8180: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
8190: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
81a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
81b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
81c0: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
81d0: 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f  ndler)(void*); /
81e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
81f0: 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a  ll when busy */.
8200: 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
8210: 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a  dlerArg;      /*
8220: 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e   Context argumen
8230: 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c  t for xBusyHandl
8240: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61  er */.  int aSta
8250: 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  t[3];           
8260: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63      /* Total cac
8270: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20  he hits, misses 
8280: 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69  and writes */.#i
8290: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
82a0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
82c0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
82d0: 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
82e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
82f0: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
8300: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
8310: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
8320: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
8330: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
8340: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
8350: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
8360: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
8370: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
8380: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
8390: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
83a0: 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
83b0: 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66  t,int); /* Notif
83c0: 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63  y of page size c
83d0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64  hanges */.  void
83e0: 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
83f0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20  oid*);          
8400: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
8410: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a   for the codec *
8420: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
8430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8440: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
8450: 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d  t to xCodec... m
8460: 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66  ethods */.#endif
8470: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
8480: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
8490: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
84a0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
84b0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
84c0: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
84d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
84e0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
84f0: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70  MIT_WAL.  Wal *p
8520: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8530: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61        /* Write-a
8540: 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79  head log used by
8550: 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77   "journal_mode=w
8560: 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  al" */.  char *z
8570: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8580: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
8590: 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61  e for write-ahea
85a0: 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  d log */.#endif.
85b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65  };../*.** Indexe
85c0: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 50  s for use with P
85d0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68  ager.aStat[]. Th
85e0: 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20  e Pager.aStat[] 
85f0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  array contains.*
8600: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63 63  * the values acc
8610: 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e 67  essed by passing
8620: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8630: 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48  _CACHE_HIT, CACH
8640: 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41  E_MISS .** or CA
8650: 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c  CHE_WRITE to sql
8660: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29  ite3_db_status()
8670: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8680: 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a  ER_STAT_HIT   0.
8690: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
86a0: 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69  AT_MISS  1.#defi
86b0: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52  ne PAGER_STAT_WR
86c0: 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ITE 2../*.** The
86d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
86e0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
86f0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
8700: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
8710: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
8720: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
8730: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
8740: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
8750: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
8760: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
8770: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
8780: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8790: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
87a0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
87b0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
87c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
87d0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
87e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
87f0: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
8800: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
8810: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8820: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
8830: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8840: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
8850: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8860: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
8870: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
8880: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8890: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
88a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
88b0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
88c0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
88d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
88e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
88f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
8900: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
8910: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
8920: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
8930: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
8940: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
8950: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
8960: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
8970: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8980: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
8990: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
89a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
89b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
89c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
89d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
89e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
89f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
8a00: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
8a10: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
8a20: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
8a30: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
8a40: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
8a50: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
8a60: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
8a70: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
8a80: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
8a90: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
8aa0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
8ab0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
8ac0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
8ad0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
8ae0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
8af0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
8b00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
8b10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
8b20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8b30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
8b40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
8b50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
8b60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
8b70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
8b80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
8b90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
8ba0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8bb0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
8bc0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8bd0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
8be0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
8bf0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
8c00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
8c10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
8c20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
8c30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
8c40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
8c50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
8c60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
8c70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
8c80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
8c90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
8ca0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
8cb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
8cc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
8cd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
8ce0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
8cf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
8d00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
8d10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
8d20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
8d30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
8d40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
8d50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
8d60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
8d70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
8d80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
8d90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
8da0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
8db0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
8dc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
8dd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
8de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8df0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
8e00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
8e10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
8e20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
8e30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
8e40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
8e50: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
8e60: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
8e70: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
8e80: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
8e90: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
8ea0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
8eb0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
8ec0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8ed0: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
8ee0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ef0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
8f00: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
8f10: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
8f20: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
8f30: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
8f40: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
8f50: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
8f60: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
8f70: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
8f80: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
8f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
8fa0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
8fb0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
8fc0: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
8fd0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
8fe0: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
8ff0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
9000: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
9010: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
9020: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
9030: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
9040: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
9050: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
9060: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
9070: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
9080: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
9090: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
90a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
90b0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
90c0: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
90d0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
90e0: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
90f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
9100: 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74 72  o USEFETCH is tr
9110: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c  ue if we are all
9120: 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  owed to use the 
9130: 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65  xFetch and xUnfe
9140: 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  tch.** interface
9150: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9160: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d  database using m
9170: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
9180: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9190: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
91a0: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
91b0: 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46  H(x) ((x)->bUseF
91c0: 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65  etch).#else.# de
91d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
91e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
91f0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
9200: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
9210: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
9220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
9230: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
9240: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
9250: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
9260: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
9270: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
9280: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
9290: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
92a0: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
92b0: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
92c0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
92d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
92e0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
92f0: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
9300: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
9310: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9320: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
9330: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
9340: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
9350: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
9360: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
9370: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
9380: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
9390: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
93a0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
93b0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
93c0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
93d0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
93e0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
93f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9400: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9410: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9430: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9440: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9450: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9460: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9470: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9480: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9490: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
94a0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
94b0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
94c0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
94d0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
94e0: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
94f0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9500: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9510: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9520: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9530: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9540: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9550: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9560: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9570: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
9580: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
9590: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
95a0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
95b0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
95c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
95d0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
95e0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
95f0: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9600: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9610: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9620: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9630: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9640: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9650: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9660: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9670: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9680: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
9690: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96a0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
96b0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
96c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
96d0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
96e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
96f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9700: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9720: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9730: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9740: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9750: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9760: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9770: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9780: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9790: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
97a0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
97b0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
97c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
97d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
97e0: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
97f0: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9800: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9810: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9820: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9830: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9840: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9850: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9860: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9870: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9880: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9890: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
98a0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
98b0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
98c0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
98d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
98e0: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
98f0: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9900: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9910: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9920: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9930: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9950: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9960: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9970: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9980: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9990: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
99a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99b0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
99c0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
99d0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
99e0: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
99f0: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9a00: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9a10: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9a20: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9a30: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9a40: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9a50: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9a60: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9a70: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9a80: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9a90: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9aa0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9ab0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9ac0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9ad0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9ae0: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9af0: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9b10: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9b20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9b30: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9b40: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9b50: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9b60: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9b70: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9b80: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9b90: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ba0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9bc0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9bd0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9be0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9bf0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9c00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9c10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c20: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c30: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9c40: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9c50: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9c60: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9c70: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9c80: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9c90: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9ca0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9cb0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9cc0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9cd0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
9ce0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
9cf0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
9d00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9d10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9d20: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9d30: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9d40: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9d50: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9d60: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9d70: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9d80: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9d90: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9da0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9db0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9dc0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9dd0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9df0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9e00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9e10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9e20: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9e30: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9e40: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9e70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e80: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9e90: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9ea0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9eb0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9ec0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
9ed0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9ee0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9ef0: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
9f00: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9f10: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9f50: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9f60: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9f70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f80: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9f90: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
9fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9fb0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
9fc0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
9fd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9fe0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9ff0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a000: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a010: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a020: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a030: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a040: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a050: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a060: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a070: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a080: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a090: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a0a0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a0b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a0e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a0f0: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a100: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a110: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a120: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a130: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a140: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a150: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a160: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a170: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a180: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a190: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a1a0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a1b0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a1c0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a1d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a1e0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a1f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a200: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a210: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a220: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a230: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a240: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a250: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a260: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a270: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a280: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a2a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a2b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a2c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a2e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2f0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a300: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a320: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a330: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a340: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a350: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a360: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a370: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a380: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a390: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3b0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a3c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a3d0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a3e0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a400: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a410: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a420: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a430: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a440: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a450: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a460: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a470: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a480: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a490: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a4a0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a4b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4c0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a4d0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a4e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a4f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a500: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a510: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a520: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a530: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a540: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a550: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a560: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a570: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a580: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a5a0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a5b0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a5c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a5d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a5e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a5f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a600: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a610: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a620: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a630: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a640: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a650: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a660: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a670: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a680: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a690: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a6a0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a6b0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a6c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a6d0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a6e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a6f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a710: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a720: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a730: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a740: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a750: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a770: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a780: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
a790: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
a7a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7b0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
a7c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a7d0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a7e0: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a7f0: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a800: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a810: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a820: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a830: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a840: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a850: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a860: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a870: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a880: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a890: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a8a0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a8b0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a8c0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a8d0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a8e0: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a8f0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
a900: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
a910: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
a920: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
a930: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
a940: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
a950: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
a960: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
a970: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
a980: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
a990: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
a9a0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
a9b0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
a9c0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a9d0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
a9e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
aa00: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
aa10: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
aa20: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
aa30: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
aa40: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
aa50: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
aa60: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
aa70: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
aa80: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
aa90: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
aaa0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
aab0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
aac0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
aad0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
aae0: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
aaf0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ab00: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ab10: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ab20: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ab30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ab40: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ab50: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ab60: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ab70: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ab80: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
ab90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aba0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
abc0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
abd0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
abe0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
abf0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
ac00: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
ac10: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
ac20: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ac30: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
ac40: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
ac50: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
ac60: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
ac70: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
ac80: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
ac90: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
aca0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acb0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
acc0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
acd0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ace0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
acf0: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
ad00: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
ad10: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
ad20: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
ad30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ad40: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
ad50: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
ad60: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
ad70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
ad80: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
ad90: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
ada0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
adb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
adc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
add0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
ade0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
adf0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ae00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ae10: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
ae20: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae40: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
ae50: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
ae60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae80: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
ae90: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
aea0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aeb0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aec0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
aed0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
aee0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aef0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
af10: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
af20: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
af30: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
af40: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
af50: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
af60: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
af70: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
af80: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
af90: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
afa0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
afb0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
afc0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
afd0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
afe0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
aff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b000: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b010: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b020: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b030: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b040: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b050: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b060: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b070: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b080: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b090: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b0a0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b0b0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b0c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b0d0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b0e0: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b0f0: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b100: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b110: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b120: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b130: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b140: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b160: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b170: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b180: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b190: 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
b1a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
b1b0: 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ager;.  int i;. 
b1c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
b1d0: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
b1e0: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
b1f0: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
b200: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
b210: 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  t[i];.    if( p-
b220: 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20  >nOrig>=pgno && 
b230: 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  0==sqlite3Bitvec
b240: 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  Test(p->pInSavep
b250: 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  oint, pgno) ){. 
b260: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b270: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b280: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
b290: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b2a0: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b2b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b2c0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b2d0: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b2e0: 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
b2f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b300: 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70  itvecTest(pPg->p
b310: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b320: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b330: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b340: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b350: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b360: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b370: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b380: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b390: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b3a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b3b0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b3c0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b3d0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b3e0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b3f0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b400: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b410: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b420: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b430: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b440: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b450: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b460: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b470: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b480: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b490: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b4a0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b4b0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b4c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b4d0: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b4e0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b4f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b500: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b510: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b520: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b530: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b540: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b550: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b560: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b570: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b580: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b590: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b5a0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b5b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b5c0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b5d0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b5e0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b5f0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b600: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b610: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b620: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b630: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b640: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b650: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b660: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b670: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b680: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b690: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b6a0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b6b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b6c0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b6d0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b6e0: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b6f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b700: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b710: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b720: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b730: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b740: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b750: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b760: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b770: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b780: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b790: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b7a0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b7b0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b7c0: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b7d0: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b7e0: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b7f0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b800: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b810: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b820: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b830: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b840: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
b850: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
b860: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
b870: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b880: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
b890: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
b8a0: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
b8b0: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
b8c0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
b8d0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
b8e0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
b8f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
b900: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
b910: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
b920: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
b930: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
b940: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b950: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
b960: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
b970: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
b980: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b990: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ck);.    if( pPa
b9a0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
b9b0: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
b9c0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
b9d0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
b9e0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
b9f0: 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  "UNLOCK %p %d\n"
ba00: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
ba10: 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ).  }.  return r
ba20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
ba30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ba40: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
ba50: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
ba60: 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c   either SHARED_L
ba70: 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44  OCK,.** RESERVED
ba80: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
ba90: 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20  VE_LOCK. If the 
baa0: 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73  caller is succes
bab0: 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a  sful, set the.**
bac0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
bad0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77  iable to the new
bae0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20   locking state. 
baf0: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
bb00: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
bb10: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
bb20: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
bb30: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63  unction is .** c
bb40: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
bb50: 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74  dify it unless t
bb60: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bb70: 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56  tate is EXCLUSIV
bb80: 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20  E_LOCK. .** See 
bb90: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
bba0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
bbb0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
bbc0: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
bbd0: 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f   .** of this..*/
bbe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
bbf0: 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  rLockDb(Pager *p
bc00: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
bc10: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bc20: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
bc30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  rt( eLock==SHARE
bc40: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
bc50: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
bc60: 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  | eLock==EXCLUSI
bc70: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
bc80: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65   pPager->eLock<e
bc90: 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Lock || pPager->
bca0: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
bcb0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
bcc0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
bcd0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
bce0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
bcf0: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67  LITE_OK && (pPag
bd00: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bd10: 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d  WN_LOCK||eLock==
bd20: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
bd30: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
bd40: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
bd50: 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
bd60: 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
bd70: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
bd80: 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
bd90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bda0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
bdb0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
bdc0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
bdd0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
bde0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
bdf0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
be00: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
be10: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
be20: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
be30: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
be40: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
be50: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
be60: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
be70: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
be80: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
be90: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
bea0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
beb0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
bec0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
bed0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
bee0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
bef0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
bf00: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
bf10: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
bf20: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
bf30: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
bf40: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
bf50: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
bf60: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
bf70: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
bf80: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
bf90: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
bfa0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
bfb0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
bfc0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
bfd0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
bfe0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
bff0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
c000: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
c010: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
c020: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
c030: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
c040: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
c050: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
c060: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
c070: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
c080: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
c090: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
c0a0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
c0b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
c0c0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
c0d0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
c0e0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
c110: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
c120: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
c130: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
c140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
c150: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
c160: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
c190: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
c1a0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
c1b0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
c1c0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
c1d0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
c1e0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
c1f0: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
c200: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
c210: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
c220: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
c230: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
c240: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
c250: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
c260: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
c270: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
c280: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
c290: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
c2a0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
c2b0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
c2c0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
c2d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c2e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
c2f0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
c300: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
c310: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
c320: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
c330: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
c340: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
c350: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
c360: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
c370: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
c380: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
c390: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
c3a0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
c3b0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
c3c0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
c3d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
c3e0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
c3f0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
c400: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
c410: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
c420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
c430: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
c440: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
c450: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
c460: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
c470: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c480: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
c490: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
c4a0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
c4b0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
c4c0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
c4d0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
c4e0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c4f0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
c500: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
c510: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
c520: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
c530: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
c540: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
c550: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
c560: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c570: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
c580: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
c590: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
c5a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
c5b0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
c5c0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
c5d0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
c5e0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c5f0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
c600: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
c610: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
c620: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c630: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
c640: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
c650: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
c660: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
c670: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
c680: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
c690: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
c6a0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
c6b0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
c6c0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
c6d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
c6e0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
c6f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c700: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
c710: 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
c720: 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
c730: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
c740: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
c750: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
c760: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
c770: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
c780: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
c790: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
c7a0: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
c7b0: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c7c0: 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43  ash(X).#define C
c7d0: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
c7e0: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
c7f0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
c800: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
c810: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
c820: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
c830: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
c840: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73  be open..** This
c850: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
c860: 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73  ts to read a mas
c870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c880: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a   name from the .
c890: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
c8a0: 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65  le and, if succe
c8b0: 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74  ssful, copies it
c8c0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
c8d0: 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65  plied .** by the
c8e0: 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d   caller. See com
c8f0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74  ments above writ
c900: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
c910: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a   for the format.
c920: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
c930: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c940: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74  l file name at t
c950: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
c960: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
c970: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
c980: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
c990: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
c9a0: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
c9b0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
c9c0: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
c9d0: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
c9e0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
c9f0: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
ca00: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
ca10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
ca20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ca30: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
ca40: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
ca50: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
ca60: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
ca70: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
ca80: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
ca90: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
caa0: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
cab0: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
cac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cad0: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
cae0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
caf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74  .**.** If a mast
cb00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cb10: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
cb20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
cb30: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
cb40: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  e, then it is co
cb50: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75  pied into the bu
cb60: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
cb70: 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a  by zMaster. A.**
cb80: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
cb90: 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64  byte is appended
cba0: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66   to the buffer f
cbb0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73  ollowing the mas
cbc0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
cbd0: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
cbe0: 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69  If it is determi
cbf0: 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74  ned that no mast
cc00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cc10: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
cc20: 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  .** zMaster[0] i
cc30: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
cc40: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
cc50: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
cc60: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
cc70: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
cc80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
cc90: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
cca0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
ccb0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
ccc0: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
ccd0: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
cce0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
ccf0: 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d  *zMaster, u32 nM
cd00: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
cd10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd20: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
cd30: 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  ode */.  u32 len
cd40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd50: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e      /* Length in
cd60: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
cd70: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
cd80: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cda0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62   Total size in b
cdb0: 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ytes of journal 
cdc0: 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20  file pJrnl */.  
cdd0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
cde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a             /* MJ
cdf0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
ce00: 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  read from journa
ce10: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
ce40: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
ce50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
ce60: 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20  agic[8];   /* A 
ce70: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
ce80: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
ce90: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  */.  zMaster[0] 
cea0: 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53  = '\0';..  if( S
ceb0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
cec0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
ced0: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a  e(pJrnl, &szJ)).
cee0: 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20     || szJ<16.   
cef0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
cf00: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
cf10: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
cf20: 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d  en)).   || len>=
cf30: 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53  nMaster .   || S
cf40: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
cf50: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
cf60: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
cf70: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
cf80: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
cf90: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
cfa0: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
cfb0: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
cfc0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
cfd0: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
cfe0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
cff0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d000: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
d010: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
d020: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
d030: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
d040: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
d050: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
d060: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d070: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
d080: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
d090: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
d0a0: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
d0b0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
d0c0: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
d0d0: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
d0e0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
d0f0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
d100: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
d110: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
d120: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
d130: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
d140: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
d150: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
d160: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
d170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d180: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
d190: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
d1a0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
d1b0: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
d1c0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
d1d0: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
d1e0: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
d1f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d200: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d210: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
d220: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
d230: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
d240: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d250: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
d260: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
d270: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
d280: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
d290: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
d2a0: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
d2b0: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
d2c0: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
d2d0: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
d2e0: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
d2f0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
d300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d320: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d370: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
d380: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
d390: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
d3b0: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
d3c0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
d3d0: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
d3e0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
d3f0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
d400: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d410: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
d420: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
d430: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
d440: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
d450: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
d460: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
d470: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
d480: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d490: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
d4a0: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
d4b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
d4c0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
d4d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
d4e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
d4f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
d500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
d510: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
d520: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d530: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
d540: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
d550: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
d560: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
d570: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
d580: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
d590: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
d5a0: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
d5b0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
d5c0: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
d5d0: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
d5e0: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
d5f0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d600: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
d610: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
d620: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
d630: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
d640: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
d650: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
d660: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
d670: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
d680: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
d690: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
d6a0: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
d6b0: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
d6c0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d6d0: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
d6e0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
d6f0: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
d700: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
d710: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
d720: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d730: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
d740: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
d750: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
d760: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
d770: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
d780: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
d790: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
d7a0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
d7c0: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
d7d0: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
d7e0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
d7f0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d800: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
d810: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
d820: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d830: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
d840: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
d850: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
d860: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
d870: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
d880: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
d890: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
d8a0: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
d8b0: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
d8c0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
d8d0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
d8e0: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
d8f0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
d900: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
d910: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
d920: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
d950: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
d960: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
d970: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66  er->jfd) );.  if
d980: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d990: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73  lOff ){.    cons
d9a0: 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70  t i64 iLimit = p
d9b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
d9c0: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c  zeLimit;    /* L
d9d0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73  ocal cache of js
d9e0: 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43  l */..    IOTRAC
d9f0: 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c  E(("JZEROHDR %p\
da00: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
da10: 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20   if( doTruncate 
da20: 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  || iLimit==0 ){.
da30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
da40: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
da50: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
da60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
da70: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
da80: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b   zeroHdr[28] = {
da90: 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0};.      rc = s
daa0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
dab0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
dac0: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
dad0: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
dae0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
daf0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
db00: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
db10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
db20: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
db30: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
db40: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
db50: 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  ncFlags);.    }.
db60: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
db70: 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61  point the transa
db80: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
db90: 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65  ed but the write
dba0: 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73   lock .    ** is
dbb0: 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
dbc0: 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
dbd0: 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69  e is a size limi
dbe0: 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  t configured for
dbf0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72   .    ** the per
dc00: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
dc10: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
dc20: 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
dc30: 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20  onsumes more.   
dc40: 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74   ** space than t
dc50: 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73  hat limit allows
dc60: 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69   for, truncate i
dc70: 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20  t now. There is 
dc80: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  no need.    ** t
dc90: 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20  o sync the file 
dca0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
dcb0: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
dcc0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
dcd0: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74  ITE_OK && iLimit
dce0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  >0 ){.      i64 
dcf0: 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  sz;.      rc = s
dd00: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
dd10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
dd20: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  z);.      if( rc
dd30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
dd40: 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  z>iLimit ){.    
dd50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dd60: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
dd70: 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b  r->jfd, iLimit);
dd80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dd90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
dda0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
ddb0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
ddc0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
ddd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
dde0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
ddf0: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
de00: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
de10: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
de20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
de30: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
de40: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
de50: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
de60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
de70: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
de80: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
de90: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
dea0: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
deb0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
dec0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
ded0: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
dee0: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
def0: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
df00: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
df10: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
df20: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
df30: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
df40: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
df50: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
df60: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
df70: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
df80: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
df90: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20  s journal..** - 
dfa0: 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73  4 bytes: Databas
dfb0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
dfc0: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
dfd0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
dfe0: 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75  - 28) bytes of u
dff0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
e000: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
e010: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
e020: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
e030: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e060: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64  */.  char *zHead
e070: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
e080: 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70  pSpace;  /* Temp
e090: 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64  orary space used
e0a0: 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72   to build header
e0b0: 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65   */.  u32 nHeade
e0c0: 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  r = (u32)pPager-
e0d0: 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a  >pageSize;/* Siz
e0e0: 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e  e of buffer poin
e0f0: 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65  ted to by zHeade
e100: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74  r */.  u32 nWrit
e110: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e130: 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65  tes of header se
e140: 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ctor written */.
e150: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e180: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
e190: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
e1a0: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
e1b0: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
e1c0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
e1d0: 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e  ..  if( nHeader>
e1e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
e1f0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48  Pager) ){.    nH
e200: 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f  eader = JOURNAL_
e210: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
e220: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e230: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
e240: 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79  vepoints and any
e250: 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72   of them were cr
e260: 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  eated .  ** sinc
e270: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
e280: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
e290: 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70   was written, up
e2a0: 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  date the .  ** P
e2b0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
e2c0: 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20  drOffset fields 
e2d0: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  now..  */.  for(
e2e0: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
e2f0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
e300: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  +){.    if( pPag
e310: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
e320: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30  i].iHdrOffset==0
e330: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
e340: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
e350: 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50  .iHdrOffset = pP
e360: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e380: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
e390: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
e3a0: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
e3b0: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
e3c0: 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57  );..  /* .  ** W
e3d0: 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69  rite the nRec Fi
e3e0: 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72  eld - the number
e3f0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
e400: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69   that follow thi
e410: 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  s.  ** journal h
e420: 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  eader. Normally,
e430: 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e   zero is written
e440: 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61   to this value a
e450: 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a  t this time..  *
e460: 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f  * After the reco
e470: 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  rds are added to
e480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e   the journal (an
e490: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79  d the journal sy
e4a0: 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69  nced, .  ** if i
e4b0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
e4c0: 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f  ), the zero is o
e4d0: 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
e4e0: 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a  the true number.
e4f0: 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20    ** of records 
e500: 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  (see syncJournal
e510: 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ())..  **.  ** A
e520: 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74   faster alternat
e530: 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20  ive is to write 
e540: 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68  0xFFFFFFFF to th
e550: 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68  e nRec field. Wh
e560: 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  en.  ** reading 
e570: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73  the journal this
e580: 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c   value tells SQL
e590: 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68  ite to assume th
e5a0: 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74  at the.  ** rest
e5b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e5c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61  file contains va
e5d0: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
e5e0: 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f  . This assumptio
e5f0: 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72  n.  ** is danger
e600: 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69  ous, as if a fai
e610: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
e620: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
e630: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
e640: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
e650: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
e660: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
e670: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
e680: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
e690: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
e6a0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
e6b0: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
e6c0: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
e6d0: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
e6e0: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
e6f0: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
e700: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
e710: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
e720: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e730: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
e740: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
e750: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
e760: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
e770: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
e780: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
e790: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
e7a0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
e7b0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
e7c0: 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
e7d0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a  ager->noSync );.
e7e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
e7f0: 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d  Sync || (pPager-
e800: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
e810: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
e820: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
e830: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
e840: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
e850: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
e860: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e870: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
e880: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
e890: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
e8a0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e8b0: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
e8c0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e8d0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e8e0: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
e8f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
e900: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
e910: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
e920: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
e930: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
e940: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
e950: 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c  alizer */ .  sql
e960: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
e970: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
e980: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
e990: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
e9a0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e9b0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e9c0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
e9d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e9e0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
e9f0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
ea00: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ea10: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ea20: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ea30: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
ea40: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
ea50: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
ea60: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
ea70: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
ea80: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ea90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eaa0: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
eab0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
eac0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
ead0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
eae0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
eaf0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eb00: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
eb10: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
eb20: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
eb30: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
eb40: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
eb50: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
eb60: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
eb70: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
eb80: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
eb90: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
eba0: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
ebb0: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
ebc0: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
ebd0: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
ebe0: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
ebf0: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
ec00: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
ec10: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
ec20: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ec30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
ec40: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
ec50: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
ec60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
ec70: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
ec80: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
ec90: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
eca0: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
ecb0: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
ecc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
ecd0: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
ece0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
ecf0: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
ed00: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
ed10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
ed20: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
ed30: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
ed40: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
ed50: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
ed60: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
ed70: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
ed80: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
ed90: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
eda0: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
edb0: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
edc0: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
edd0: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
ede0: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
edf0: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
ee00: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
ee10: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
ee20: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
ee30: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
ee40: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
ee50: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
ee60: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
ee70: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
ee80: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
ee90: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
eea0: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
eeb0: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
eec0: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
eed0: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
eee0: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
eef0: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
ef00: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
ef10: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
ef20: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
ef30: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
ef40: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
ef50: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
ef60: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
ef70: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
ef80: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
ef90: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
efa0: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
efb0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
efc0: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
efd0: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
efe0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
eff0: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
f000: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
f010: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
f020: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
f030: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
f040: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
f050: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
f060: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
f070: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
f080: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
f090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
f0a0: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
f0b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
f0c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
f0d0: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
f0e0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f0f0: 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  lOff);.    asser
f100: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f110: 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
f120: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
f130: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
f140: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
f150: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
f160: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
f170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
f180: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
f190: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
f1a0: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
f1b0: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
f1c0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
f1d0: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
f1e0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f1f0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f200: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
f210: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
f220: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
f230: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
f240: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
f250: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
f260: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
f270: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
f280: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
f290: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
f2a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f2b0: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
f2c0: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
f2d0: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
f2e0: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
f2f0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
f300: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
f310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
f320: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
f330: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
f340: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
f350: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
f360: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
f370: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
f380: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
f390: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
f3a0: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
f3b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f3c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
f3d0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
f3e0: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
f3f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
f400: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f410: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
f420: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
f430: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
f440: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
f450: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
f460: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
f470: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
f480: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
f490: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
f4a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f4b0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
f4c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
f4d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
f4e0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
f4f0: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
f500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
f510: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
f520: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
f530: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
f540: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f550: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
f560: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
f570: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
f580: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
f590: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
f5a0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f5b0: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
f5c0: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f5e0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
f5f0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
f600: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
f610: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
f640: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
f650: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
f660: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
f670: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
f680: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
f690: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
f6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f6b0: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
f6c0: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
f6d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
f6e0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
f6f0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
f700: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f710: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
f720: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
f730: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
f740: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
f750: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
f760: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
f770: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
f780: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
f790: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
f7a0: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
f7b0: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
f7c0: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
f7d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f7e0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
f7f0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
f800: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
f810: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
f820: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
f830: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
f840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f850: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
f860: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
f870: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
f880: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
f890: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
f8a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f8b0: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
f8c0: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
f8d0: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
f8e0: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
f8f0: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
f900: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
f910: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
f920: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
f930: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
f940: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
f950: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
f960: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
f970: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
f980: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
f990: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
f9a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
f9b0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
f9c0: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
f9d0: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
f9e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
f9f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fa00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
fa10: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
fa20: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
fa30: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
fa40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fa50: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
fa60: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
fa70: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
fa80: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
fa90: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
faa0: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
fab0: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
fac0: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
fad0: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
fae0: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
faf0: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
fb00: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fb10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
fb20: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
fb30: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
fb40: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
fb50: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fb60: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
fb70: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
fb80: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
fb90: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
fba0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
fbb0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
fbc0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
fbd0: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
fbe0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
fbf0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
fc00: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
fc10: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
fc20: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fc30: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
fc40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
fc50: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
fc60: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
fc70: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
fc80: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
fc90: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
fca0: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fcc0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
fcd0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
fce0: 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  er */..    /* Re
fcf0: 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ad the page-size
fd00: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fd10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fd20: 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69  fields. */.    i
fd30: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
fd40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fd50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
fd60: 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72  Off+20, &iSector
fd70: 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53  Size)).     || S
fd80: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fd90: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fda0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fdb0: 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29  24, &iPageSize))
fdc0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
fdd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
fde0: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20      /* Versions 
fdf0: 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
fe00: 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65  to 3.5.8 set the
fe10: 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   page-size field
fe20: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   of the.    ** j
fe30: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
fe40: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
fe50: 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ase, assume that
fe60: 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53   the Pager.pageS
fe70: 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ize.    ** varia
fe80: 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ble is already s
fe90: 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  et to the correc
fea0: 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20  t page size..   
feb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
fec0: 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eSize==0 ){.    
fed0: 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50    iPageSize = pP
fee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
fef0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
ff00: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
ff10: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
ff20: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
ff30: 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
ff40: 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
ff50: 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
ff60: 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
ff70: 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
ff80: 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
ff90: 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
ffa0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
ffb0: 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
ffc0: 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
ffd0: 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
ffe0: 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
fff0: 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
10000 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
10010 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
10020 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
10030 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
10040 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
10050 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
10060 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
10070 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
10080 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
10090 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
100a0 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
100b0 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
100c0 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
100d0 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
100e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
100f0 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
10100 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
10110 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
10120 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
10130 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
10140 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
10150 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
10160 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10170 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
10180 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
10190 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
101a0 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
101b0 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
101c0 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
101d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
101e0 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
101f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10200 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
10210 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10220 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
10230 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
10240 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
10250 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
10260 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
10270 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
10280 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
10290 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
102a0 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
102b0 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
102c0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
102d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
102e0 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
102f0 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20  er, &iPageSize, 
10300 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
10310 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
10320 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
10330 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
10340 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
10350 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
10360 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
10370 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
10380 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
10390 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
103a0 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
103b0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
103c0 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
103d0 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
103e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
103f0 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
10400 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
10410 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
10420 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
10430 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
10440 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
10450 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
10460 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
10470 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
10480 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
10490 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
104a0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
104b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
104c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
104d0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
104e0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
104f0 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
10500 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10510 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
10520 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
10530 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
10540 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
10550 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
10560 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
10570 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
10580 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
10590 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
105a0 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
105b0 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
105c0 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
105d0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
105e0 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
105f0 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
10600 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
10610 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
10620 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
10630 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
10640 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
10650 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
10660 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
10670 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10680 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
10690 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
106a0 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
106b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
106c0 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
106d0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
106e0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
106f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10700 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
10710 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
10720 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
10730 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
10740 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
10750 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
10760 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
10770 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
10780 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
10790 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
107a0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
107b0 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
107c0 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
107d0 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
107e0 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
107f0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
10800 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
10810 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
10820 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
10830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
10840 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
10850 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
10860 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
10870 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
108a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
108b0 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108d0 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
108e0 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
108f0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10910 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
10920 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
10930 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
10940 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
10950 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10960 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
10970 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
10980 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
109a0 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
109b0 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
109c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
109d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
109e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
109f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
10a00 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  ) );..  if( !zMa
10a10 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67  ster .   || pPag
10a20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10a30 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10a40 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c  DE_MEMORY .   ||
10a50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10a60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10a70 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29  NALMODE_OFF .  )
10a80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10a90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
10aa0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
10ab0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 1;.  assert( i
10ac0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
10ad0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
10ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
10af0 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
10b00 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f  urnalOff );..  /
10b10 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
10b20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  length in bytes 
10b30 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
10b40 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20   of zMaster */. 
10b50 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20   for(nMaster=0; 
10b60 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10b70 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20  ; nMaster++){.  
10b80 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
10b90 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d  er[nMaster];.  }
10ba0 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
10bb0 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
10bc0 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
10bd0 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
10be0 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
10bf0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10c00 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
10c10 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
10c20 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
10c30 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
10c40 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
10c50 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
10c60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
10c70 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
10c80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10c90 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
10ca0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
10cb0 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  );.  }.  iHdrOff
10cc0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10cd0 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69  alOff;..  /* Wri
10ce0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10cf0 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68  urnal data to th
10d00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
10d10 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20  rnal file. If.  
10d20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
10d30 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  rs, return the e
10d40 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
10d50 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20   caller..  */.  
10d60 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20  if( (0 != (rc = 
10d70 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10d80 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10d90 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
10da0 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c  pPager)))).   ||
10db0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10dc0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10dd0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
10de0 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f  , nMaster, iHdrO
10df0 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30  ff+4))).   || (0
10e00 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10e10 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10e20 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10e30 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29  ster, nMaster)))
10e40 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10e50 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10e60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10e70 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c  Off+4+nMaster+4,
10e80 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20   cksum))).   || 
10e90 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
10ea0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
10eb0 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
10ec0 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66  Magic, 8, iHdrOf
10ed0 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29  f+4+nMaster+8)))
10ee0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
10ef0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
10f00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10f10 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a   (nMaster+20);..
10f20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
10f30 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e  r is in peristen
10f40 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  t-journal mode, 
10f50 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61  then the physica
10f60 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  l .  ** journal-
10f70 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20  file may extend 
10f80 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
10f90 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10fa0 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  al name.  ** and
10fb0 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69   8 bytes of magi
10fc0 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74  c data just writ
10fd0 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ten to the file.
10fe0 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64   This is .  ** d
10ff0 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65  angerous because
11000 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
11010 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72  lback a hot-jour
11020 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69  nal file.  ** wi
11030 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
11040 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65  o find the maste
11050 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74  r-journal name t
11060 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
11070 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
11080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
11090 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hot. .  **.  ** 
110a0 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f  Easiest thing to
110b0 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e   do in this scen
110c0 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63  ario is to trunc
110d0 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
110e0 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68  .  ** file to th
110f0 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  e required size.
11100 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c  .  */ .  if( SQL
11110 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
11120 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
11130 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72  pPager->jfd, &jr
11140 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a  nlSize)).   && j
11150 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e  rnlSize>pPager->
11160 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a  journalOff.  ){.
11170 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11180 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
11190 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
111a0 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d  journalOff);.  }
111b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
111c0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
111d0 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
111e0 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
111f0 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75  age number. Retu
11200 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
11210 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
11220 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65  ULL if the reque
11230 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
11240 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
11250 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
11260 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
11270 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
11280 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
11290 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
112c0 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  alue */..  /* It
112d0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
112e0 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50   for a call to P
112f0 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74  cacheFetch() wit
11300 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20  h createFlag==0 
11310 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69  to.  ** fail, si
11320 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74  nce no attempt t
11330 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d  o allocate dynam
11340 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ic memory will b
11350 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28  e made..  */.  (
11360 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63  void)sqlite3Pcac
11370 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
11380 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
11390 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &p);.  return 
113a0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  p;.}../*.** Disc
113b0 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
113c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
113d0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
113e0 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
113f0 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
11400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11410 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
11420 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
11430 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74  Backup);.  sqlit
11440 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
11450 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
11460 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
11470 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
11480 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
11490 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
114a0 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
114b0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
114c0 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
114d0 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
114e0 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
114f0 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
11500 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
11510 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11520 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
11530 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
11540 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50  eAllSavepoints(P
11550 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11560 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
11570 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
11580 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  or for looping t
11590 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61  hrough Pager.aSa
115a0 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72  vepoint */.  for
115b0 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
115c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
115d0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
115e0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
115f0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11600 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
11610 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  t);.  }.  if( !p
11620 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11630 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49  Mode || sqlite3I
11640 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
11650 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
11660 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11670 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
11680 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
11690 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
116a0 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
116b0 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
116c0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
116d0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
116e0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
116f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11700 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
11710 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
11720 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
11730 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
11740 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
11750 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
11760 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
11770 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
11780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
11790 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
117a0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
117b0 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
117c0 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
117d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
117e0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11810 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
11820 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11830 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11840 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
11850 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11860 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11870 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
11880 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
11890 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
118a0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
118b0 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
118c0 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
118d0 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
118e0 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
118f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11900 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11910 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
11930 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
11940 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
11950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11960 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11970 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
11980 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11990 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
119a0 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74   and not.** in t
119b0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
119c0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73 77  Otherwise, it sw
119d0 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  itches the pager
119e0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a   to PAGER_OPEN.*
119f0 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  * state..**.** I
11a00 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
11a10 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ot in exclusive-
11a20 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65  access mode, the
11a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11a40 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  s.** completely 
11a50 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65  unlocked. If the
11a60 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
11a70 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73  d and the file-s
11a80 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f  ystem does.** no
11a90 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55 4e  t exhibit the UN
11aa0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
11ab0 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68  PEN property, th
11ac0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
11ad0 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20  s.** closed (if 
11ae0 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a  it is open)..**.
11af0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
11b00 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  is in ERROR stat
11b10 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
11b20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
11b30 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
11b40 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
11b50 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64 65  che are discarde
11b60 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69  d before switchi
11b70 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74  ng back to .** t
11b80 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52  he OPEN state. R
11b90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
11ba0 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20 69  ther the pager i
11bb0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  s in exclusive-m
11bc0 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61  ode.** or not, a
11bd0 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ny journal file 
11be0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
11bf0 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20  -system will be 
11c00 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20  treated.** as a 
11c10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
11c20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
11c30 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61 64  next time a read
11c40 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
11c50 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68  is opened (by th
11c60 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68  is or by any oth
11c70 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a  er connection)..
11c80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
11c90 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
11ca0 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61  r *pPager){..  a
11cb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11cc0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
11cd0 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  DER .       || p
11ce0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11cf0 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20  AGER_OPEN .     
11d00 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11d10 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
11d20 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65   .  );..  sqlite
11d30 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11d40 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11d50 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
11d60 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
11d70 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11d80 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
11d90 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
11da0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
11db0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
11dc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
11dd0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e      sqlite3WalEn
11de0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
11df0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
11e00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
11e10 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
11e20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
11e30 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
11e40 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
11e50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11e60 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
11e70 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20  r code returned 
11e80 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  by pagerUnlockDb
11e90 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  () */.    int iD
11ea0 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65  c = isOpen(pPage
11eb0 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73  r->fd)?sqlite3Os
11ec0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11ed0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
11ee0 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ):0;..    /* If 
11ef0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
11f00 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c  stem support del
11f10 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69  etion of open fi
11f20 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  les, then.    **
11f30 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
11f40 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
11f50 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
11f60 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77  se lock.  Otherw
11f70 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68  ise.    ** anoth
11f80 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
11f90 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
11fa0 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c  delete might del
11fb0 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20  ete the file.   
11fc0 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64   ** out from und
11fd0 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
11fe0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11ff0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
12000 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ORY   & 5)!=1 );
12010 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12020 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12030 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31  OFF      & 5)!=1
12040 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12050 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12060 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29  DE_WAL      & 5)
12070 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12080 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12090 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26  LMODE_DELETE   &
120a0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
120b0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
120c0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
120d0 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20  E & 5)==1 );.   
120e0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
120f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
12100 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a  IST  & 5)==1 );.
12110 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20      if( 0==(iDc 
12120 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  & SQLITE_IOCAP_U
12130 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
12140 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21  OPEN).     || 1!
12150 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  =(pPager->journa
12160 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29  lMode & 5).    )
12170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
12180 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
12190 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
121a0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
121b0 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  is in the ERROR 
121c0 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61  state and the ca
121d0 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ll to unlock the
121e0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
121f0 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74   file fails, set
12200 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
12210 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  k to UNKNOWN_LOC
12220 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  K. See the comme
12230 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  nt.    ** above 
12240 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
12250 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
12260 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
12270 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20  of why this.    
12280 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ** is necessary.
12290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
122a0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
122b0 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  Pager, NO_LOCK);
122c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
122d0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
122e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
122f0 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  ERROR ){.      p
12300 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55  Pager->eLock = U
12310 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20  NKNOWN_LOCK;.   
12320 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   }..    /* The p
12330 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62  ager state may b
12340 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50  e changed from P
12350 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41  AGER_ERROR to PA
12360 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20  GER_OPEN here.  
12370 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65    ** without cle
12380 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  aring the error 
12390 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e  code. This is in
123a0 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20  tentional - the 
123b0 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64  error.    ** cod
123c0 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64  e is cleared and
123d0 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74   the cache reset
123e0 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65   in the block be
123f0 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
12400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12410 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65  errCode || pPage
12420 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
12430 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50  _ERROR );.    pP
12440 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12450 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
12460 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12470 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a  PAGER_OPEN;.  }.
12480 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65  .  /* If Pager.e
12490 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
124a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
124b0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
124c0 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72  annot be.  ** tr
124d0 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
124e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
124f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
12500 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
12510 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61  ,.  ** it can sa
12520 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74  fely move back t
12530 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  o PAGER_OPEN sta
12540 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  te. This happens
12550 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f   in both.  ** no
12560 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69  rmal and exclusi
12570 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ve-locking mode.
12580 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12590 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
125a0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
125b0 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  B );.    pager_r
125c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
125d0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
125e0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
125f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12600 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12610 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12620 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12630 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
12640 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
12650 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
12660 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
12670 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
12680 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
12690 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
126a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
126b0 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  dr = 0;.  pPager
126c0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
126d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
126e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
126f0 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f  d whenever an IO
12700 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f  ERR or FULL erro
12710 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  r that requires.
12720 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
12730 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20  transition into 
12740 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12750 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65  may ahve occurre
12760 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  d..** The first 
12770 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
12780 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
12790 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
127a0 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65  e second .** the
127b0 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
127c0 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
127d0 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
127e0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a  function. The .*
127f0 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * value returned
12800 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
12810 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12820 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
12830 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
12840 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12850 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  t is SQLITE_FULL
12860 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  , SQLITE_IOERR o
12870 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  r one of the.** 
12880 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c  IOERR sub-codes,
12890 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72   the pager enter
128a0 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  s the ERROR stat
128b0 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  e and the error 
128c0 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65  code.** is store
128d0 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  d in Pager.errCo
128e0 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61  de. While the pa
128f0 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74  ger remains in t
12900 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a  he ERROR state,.
12910 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49  ** all major API
12920 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61   calls on the Pa
12930 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
12940 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65  tely return Page
12950 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a  r.errCode..**.**
12960 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
12970 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
12980 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12990 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
129a0 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
129b0 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
129c0 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
129d0 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
129e0 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
129f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12a00 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
12a10 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
12a20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
12a30 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
12a40 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
12a50 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
12a60 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
12a70 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
12a80 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
12a90 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
12aa0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
12ab0 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
12ac0 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
12ad0 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
12ae0 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
12af0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12b00 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
12b10 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
12b20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
12b30 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
12b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
12b50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12b60 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
12b70 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
12b80 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
12b90 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
12ba0 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
12bb0 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
12bc0 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
12bd0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
12be0 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
12bf0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
12c00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12c10 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  = rc;.    pPager
12c20 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12c30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
12c40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
12c50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
12c60 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
12c70 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
12c80 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
12c90 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
12ca0 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
12cb0 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
12cc0 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
12cd0 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
12ce0 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
12cf0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
12d00 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
12d10 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
12d20 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
12d30 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
12d40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
12d50 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
12d60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12d70 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
12d80 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
12d90 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
12da0 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
12db0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  action..** .** T
12dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
12dd0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50  ever called in P
12de0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
12df0 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65  . If it is calle
12e00 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f  d.** in PAGER_NO
12e10 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52  NE or PAGER_SHAR
12e20 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  ED state and the
12e30 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65   lock held is le
12e40 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  ss.** exclusive 
12e50 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20  than a RESERVED 
12e60 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f  lock, it is a no
12e70 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -op..**.** Other
12e80 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
12e90 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
12ea0 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
12eb0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
12ec0 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
12ed0 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
12ee0 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
12ef0 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
12f00 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
12f10 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
12f20 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
12f30 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
12f40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
12f50 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
12f60 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
12f70 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
12f80 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
12f90 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
12fa0 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
12fb0 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
12fc0 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
12fd0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
12fe0 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
12ff0 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13000 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
13010 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
13020 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
13030 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
13040 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
13050 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
13060 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13070 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
13080 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13090 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
130a0 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
130b0 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
130c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
130d0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
130e0 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
130f0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
13100 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
13110 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
13120 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
13130 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
13140 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
13150 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
13160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13170 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
13180 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
13190 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
131a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
131b0 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
131c0 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
131d0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
131e0 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
131f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
13200 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
13210 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
13220 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
13230 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
13240 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
13250 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
13260 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
13270 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
13280 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
13290 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
132a0 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
132b0 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
132c0 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
132d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
132e0 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
132f0 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
13300 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
13310 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
13320 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
13330 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
13340 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
13350 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
13360 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
13370 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
13380 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
13390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
133a0 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70  finalized, the p
133b0 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
133c0 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
133d0 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20  ..** If running 
133e0 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65  in non-exclusive
133f0 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20   rollback mode, 
13400 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
13410 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e  file is .** down
13420 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52  graded to a SHAR
13430 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  ED_LOCK..**.** S
13440 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
13450 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
13460 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
13470 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
13480 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
13490 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
134a0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
134b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
134c0 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
134d0 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
134e0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
134f0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
13500 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
13510 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
13520 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13530 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
13540 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
13550 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
13560 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13570 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
13580 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13590 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
135a0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
135b0 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
135c0 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
135d0 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
135e0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
135f0 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
13600 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
13610 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
13620 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
13630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13640 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13650 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
13660 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c  , int hasMaster,
13670 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
13680 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13690 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
136a0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
136b0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
136c0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
136d0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
136e0 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
136f0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
13700 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
13710 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
13720 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
13730 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
13740 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
13750 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
13760 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
13770 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
13780 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
13790 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
137a0 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
137b0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
137c0 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
137d0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
137e0 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
137f0 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
13800 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
13810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
13820 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
13830 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
13840 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
13850 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
13860 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
13870 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
13880 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
13890 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
138a0 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
138b0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
138c0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
138d0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
138e0 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
138f0 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
13900 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
13910 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
13920 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
13930 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
13940 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
13950 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13960 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
13970 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
13980 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
13990 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
139a0 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
139b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
139c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
139d0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
139e0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
139f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13a00 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
13a10 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
13a20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
13a30 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
13a40 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
13a50 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
13a60 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
13a80 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
13a90 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
13aa0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
13ab0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
13ac0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
13ad0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
13ae0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13af0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
13b00 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
13b10 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
13b20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
13b30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
13b40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13b50 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
13b60 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13b70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13b90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13ba0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
13bb0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
13bc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
13bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13be0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13bf0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13c00 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
13c10 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
13c20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13c60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
13c70 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
13c80 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
13c90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13ca0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
13cc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13cd0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13ce0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
13cf0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
13d00 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
13d10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13d20 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
13d30 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
13d40 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
13d50 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
13d60 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
13d70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13d80 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
13d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13da0 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
13db0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
13dc0 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
13dd0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
13de0 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
13df0 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
13e00 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
13e10 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
13e20 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
13e30 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
13e40 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
13e50 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
13e60 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
13e70 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
13e80 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
13e90 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
13ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
13eb0 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  al. .      */.  
13ec0 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20      int bDelete 
13ed0 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  = (!pPager->temp
13ee0 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33 4a  File && sqlite3J
13ef0 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50 61  ournalExists(pPa
13f00 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20 20  ger->jfd));.    
13f10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13f20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13f30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13f40 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20  _DELETE .       
13f50 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
13f60 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13f70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13f80 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
13f90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13fa0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13fb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
13fc0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
13fd0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13fe0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
13ff0 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b    if( bDelete ){
14000 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14010 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14020 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
14030 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
14040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14050 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
14060 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
14070 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
14080 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
14090 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
140a0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
140b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
140c0 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69  bSize==0 && sqli
140d0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
140e0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
140f0 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64  e)>0 ){.    PgHd
14100 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  r *p = pager_loo
14110 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
14120 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
14130 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
14140 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
14150 33 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a  3PagerUnref(p);.
14160 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14170 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
14180 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
14190 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
141a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
141b0 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
141c0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
141d0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
141e0 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
141f0 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  che);.  sqlite3P
14200 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
14210 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
14220 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14230 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
14240 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
14250 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
14260 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
14270 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
14280 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
14290 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
142a0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
142b0 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
142c0 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
142d0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
142e0 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
142f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14300 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14310 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
14320 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
14330 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
14340 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
14350 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
14360 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
14370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
14380 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
14390 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
143a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
143b0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
143c0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
143d0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
143e0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
143f0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
14400 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
14410 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
14420 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
14430 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
14440 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
14450 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14460 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
14470 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
14480 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14490 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
144a0 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
144b0 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
144c0 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
144d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
144e0 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
144f0 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
14500 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
14510 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
14520 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
14530 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
14540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14550 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
14560 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
14570 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
14580 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
14590 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
145a0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
145b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
145c0 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
145d0 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
145e0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
145f0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
14600 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
14610 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
14620 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
14630 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14640 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
14650 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
14660 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
14670 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
14680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
14690 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
146a0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
146b0 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
146c0 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
146d0 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
146e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
146f0 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
14700 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14710 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
14720 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
14730 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14740 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
14750 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
14760 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
14770 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14780 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14790 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
147a0 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
147b0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
147c0 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
147d0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
147e0 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
147f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14800 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
14810 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
14820 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
14830 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
14840 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
14850 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14860 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14870 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14880 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14890 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
148a0 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
148b0 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
148c0 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
148d0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
148e0 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
148f0 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14900 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14910 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
14920 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
14930 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
14940 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
14950 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14960 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14970 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14980 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14990 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
149a0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
149b0 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
149c0 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
149d0 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
149e0 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
149f0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
14a00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14a10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14a20 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
14a30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
14a40 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
14a50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14a60 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14a70 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14a80 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14a90 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14aa0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14ab0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14ac0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14ad0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14ae0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
14b00 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
14b10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
14b20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14b30 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
14b40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14b50 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14b60 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14b70 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14b80 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
14b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14ba0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14bb0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14bc0 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14bd0 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14be0 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14bf0 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14c00 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
14c10 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14c20 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14c30 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14c40 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14c50 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14c60 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14c70 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14c80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14c90 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14ca0 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14cb0 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14cc0 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14cd0 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14ce0 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14cf0 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14d00 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
14d10 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14d20 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14d30 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14d40 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14d50 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14d60 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14d70 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14d80 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14d90 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14da0 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14db0 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
14dc0 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
14dd0 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
14de0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
14df0 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
14e00 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
14e10 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
14e20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
14e30 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
14e40 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
14e50 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
14e60 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14e70 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14e80 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14e90 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14ea0 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14eb0 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
14ec0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
14ed0 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
14ee0 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
14ef0 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
14f00 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
14f10 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
14f20 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
14f30 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
14f40 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
14f50 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
14f60 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14f70 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14f80 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14f90 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14fa0 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14fb0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
14fc0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
14fd0 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
14fe0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
14ff0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15000 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
15010 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15020 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
15030 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
15040 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
15050 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
15060 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
15070 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
15080 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
15090 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
150a0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
150b0 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
150c0 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
150d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
150e0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
150f0 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15100 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15110 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
15120 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
15130 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
15140 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
15150 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
15160 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
15190 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
151a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
151b0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
151c0 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
151d0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
151e0 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
151f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15200 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
15210 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
15220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
15230 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
15240 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
15250 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
15260 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
15270 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
15280 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
15290 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
152a0 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
152b0 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
152c0 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
152d0 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
152e0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
152f0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15300 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15310 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
15320 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
15330 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
15340 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
15350 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
15360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
15370 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15380 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
15390 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
153a0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
153b0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
153c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
153d0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
153e0 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
153f0 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
15400 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
15410 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
15420 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
15430 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
15440 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
15450 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
15460 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
15470 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
15480 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
15490 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
154a0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
154b0 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
154c0 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
154d0 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
154e0 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
154f0 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
15500 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
15510 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
15520 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
15530 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
15540 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
15550 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15560 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
15570 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
15580 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15590 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
155a0 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
155b0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
155c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
155d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
155e0 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
155f0 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
15600 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15610 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
15620 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
15630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15640 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
15650 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
15660 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
15670 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
15680 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
15690 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
156a0 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
156b0 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
156c0 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
156d0 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
156e0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
156f0 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
15700 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
15710 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
15720 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
15730 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
15740 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
15750 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
15760 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
15770 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15780 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15790 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
157a0 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
157b0 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
157c0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
157d0 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
157e0 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
157f0 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15800 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
15810 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15820 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15830 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15840 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15850 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
15860 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15870 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15880 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15890 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
158a0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
158b0 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
158c0 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
158d0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
158e0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
158f0 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15900 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
15910 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15930 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15940 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15950 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15980 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15990 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
159a0 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
159b0 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
159c0 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
159d0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
159e0 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a00 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
15a10 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15a20 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15a30 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15a40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15a50 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
15a60 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15a70 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15a80 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15a90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15aa0 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15ab0 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15ac0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ae0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15af0 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15b00 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
15b10 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15b20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15b30 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15b40 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15b50 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15b80 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15b90 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15ba0 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15bc0 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15be0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15bf0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15c00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
15c10 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15c20 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15c30 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15c40 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15c50 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15c60 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15c70 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15c80 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15c90 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15ca0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15cb0 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15cc0 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15cd0 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15ce0 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15cf0 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15d00 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
15d10 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15d20 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15d30 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15d40 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15d50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15d60 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15d70 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15d80 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15d90 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15da0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15db0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
15dc0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
15dd0 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
15de0 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
15df0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
15e00 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
15e10 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
15e20 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
15e30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
15e40 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15e50 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
15e60 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15e70 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15e80 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15e90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15ea0 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15eb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
15ec0 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
15ed0 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
15ee0 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
15ef0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15f00 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
15f10 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
15f20 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
15f30 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
15f40 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
15f50 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
15f60 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15f70 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15f80 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15f90 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15fa0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15fb0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
15fc0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
15fd0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
15fe0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15ff0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16000 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
16010 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
16020 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
16030 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
16040 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
16050 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
16060 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
16070 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16080 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
16090 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
160a0 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
160b0 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
160c0 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
160d0 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
160e0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
160f0 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16100 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16110 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16120 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
16130 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
16140 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
16150 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
16160 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
16170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16180 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
16190 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
161a0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
161b0 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
161c0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
161d0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
161e0 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
161f0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16200 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
16210 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
16220 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
16230 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
16240 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
16250 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
16260 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
16270 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
16280 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16290 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
162a0 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
162b0 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
162c0 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
162d0 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
162e0 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
162f0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
16300 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
16310 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
16320 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
16330 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
16340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
16350 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
16360 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
16370 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
16380 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
16390 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
163a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
163b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
163c0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
163d0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
163e0 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
163f0 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
16400 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16410 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
16420 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
16430 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
16440 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
16450 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
16460 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
16470 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
16480 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
16490 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
164a0 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
164b0 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
164c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
164d0 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
164e0 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
164f0 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
16500 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
16510 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
16520 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
16530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16550 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
16560 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
16570 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
16580 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
16590 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
165a0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
165b0 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
165c0 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
165d0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
165e0 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
165f0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
16600 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
16610 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16620 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
16630 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
16640 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
16650 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
16660 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
16670 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
16680 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
16690 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
166a0 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
166b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
166c0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
166d0 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
166e0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
166f0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
16700 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
16710 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
16720 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
16730 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
16740 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
16750 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
16760 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
16770 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16780 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16790 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
167a0 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
167b0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
167c0 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
167d0 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
167e0 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
167f0 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16800 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
16810 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16820 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16830 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16840 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
16850 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
16860 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16870 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16880 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16890 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
168a0 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
168b0 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
168c0 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
168d0 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
168e0 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
168f0 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16900 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
16910 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16920 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16930 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16940 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
16950 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
16960 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
16970 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
16980 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
16990 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
169a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
169b0 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
169c0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
169d0 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
169e0 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
169f0 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
16a00 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
16a10 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
16a20 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
16a30 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16a40 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16a50 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
16a60 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
16a70 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
16a80 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16a90 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
16aa0 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16ab0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
16ac0 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
16ad0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
16ae0 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
16af0 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
16b00 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
16b10 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
16b20 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
16b30 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
16b40 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
16b50 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
16b60 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16b70 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16b80 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16b90 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16ba0 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16bb0 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
16bc0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16bd0 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
16be0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
16bf0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16c00 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
16c10 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
16c20 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
16c30 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
16c40 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
16c50 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
16c60 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16c70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16c80 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16c90 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16ca0 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16cb0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
16cc0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16cd0 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
16ce0 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
16cf0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
16d00 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
16d10 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16d20 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
16d30 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
16d40 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
16d50 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
16d60 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16d70 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16d80 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16d90 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16da0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16db0 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
16dc0 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
16dd0 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
16de0 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
16df0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
16e00 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
16e10 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
16e20 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
16e30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
16e40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16e50 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
16e60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16e70 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
16e80 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
16e90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16ea0 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
16eb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16ec0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
16ed0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b  PEN || pPg==0 );
16ee0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
16ef0 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
16f00 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
16f10 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
16f20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16f30 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
16f40 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
16f50 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
16f60 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
16f70 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
16f80 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
16f90 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
16fa0 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16fb0 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
16fc0 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
16fd0 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
16fe0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
16ff0 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
17000 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
17010 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
17020 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
17030 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
17040 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28   }.  if( isOpen(
17050 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
17060 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
17070 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
17080 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
17090 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
170a0 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e  PEN).   && isSyn
170b0 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
170c0 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
170d0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
170e0 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
170f0 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
17100 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
17110 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
17120 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
17130 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
17140 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17150 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
17160 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
17170 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61  ger->fd, (u8 *)a
17180 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17190 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
171a0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
171b0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
171c0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
171d0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
171e0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  o;.    }.    if(
171f0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
17200 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31   ){.      CODEC1
17210 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
17220 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
17230 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20  TE_NOMEM);.     
17240 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
17250 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
17260 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
17270 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43  )aData);.      C
17280 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
17290 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
172a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61  =SQLITE_NOMEM, a
172b0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
172c0 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
172d0 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
172e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
172f0 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
17300 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
17310 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
17320 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
17330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
17340 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
17350 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
17360 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
17370 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
17380 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
17390 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
173a0 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
173b0 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
173c0 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
173d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
173e0 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
173f0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
17400 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
17410 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17420 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
17430 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
17440 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
17450 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
17460 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
17470 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
17480 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
17490 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
174a0 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
174b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
174c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
174d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
174e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
174f0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
17500 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
17510 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
17520 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
17530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17540 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
17550 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
17560 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
17570 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
17580 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
17590 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
175a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
175b0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
175c0 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
175d0 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
175e0 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
175f0 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
17600 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
17610 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
17620 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
17630 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
17640 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
17650 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
17660 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
17670 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
17680 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
17690 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29  G_ROLLBACK)==0 )
176a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
176b0 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
176c0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
176d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
176e0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
176f0 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c  ger, pgno, &pPg,
17700 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
17710 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
17720 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
17730 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b  _ROLLBACK)!=0 );
17740 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17750 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
17760 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
17770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17780 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17790 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
177a0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
177b0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
177c0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
177d0 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
177e0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
177f0 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17800 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17810 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17820 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17830 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17840 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17850 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
17860 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
17870 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
17880 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
17890 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
178a0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
178b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
178c0 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
178d0 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
178e0 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
178f0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17900 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17910 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17920 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17930 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17940 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17950 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
17960 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
17970 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17980 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
17990 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
179a0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
179b0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
179c0 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
179d0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
179e0 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
179f0 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17a00 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17a10 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17a20 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17a30 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17a40 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17a50 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
17a60 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
17a70 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
17a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17a90 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
17aa0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
17ab0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17ac0 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17ad0 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17ae0 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17af0 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17b00 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17b10 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17b20 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17b30 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17b40 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17b50 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
17b60 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
17b70 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
17b80 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
17b90 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
17ba0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
17bb0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17bc0 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17bd0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17be0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17bf0 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17c00 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17c10 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17c20 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17c30 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17c40 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17c50 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
17c60 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
17c70 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
17c80 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
17c90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
17ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
17cb0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17cc0 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17cd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17ce0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17cf0 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17d00 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17d10 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17d20 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17d30 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17d40 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17d50 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
17d60 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17d70 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17d80 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
17d90 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
17da0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
17db0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17dc0 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17dd0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17de0 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17df0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17e00 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17e10 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17e20 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17e30 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17e40 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17e50 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
17e60 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
17e70 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
17e80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
17ea0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
17eb0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17ec0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17ed0 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17ee0 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17ef0 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17f00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17f10 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17f20 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17f30 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17f40 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17f50 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
17f60 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
17f70 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
17f80 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
17f90 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
17fa0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
17fb0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
17fc0 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
17fd0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
17fe0 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17ff0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
18000 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18010 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
18020 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
18030 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
18040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18050 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
18060 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
18070 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
18080 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
18090 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
180a0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
180b0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
180c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
180d0 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
180e0 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
180f0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18100 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18110 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
18120 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18130 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
18140 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
18150 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
18160 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
18170 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
18180 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
18190 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
181a0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
181b0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
181c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
181d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
181e0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
181f0 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18200 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18210 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
18220 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
18230 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
18240 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
18250 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
18260 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
18270 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
18280 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18290 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
182a0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
182b0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
182c0 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
182d0 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
182e0 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
182f0 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18300 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18310 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
18320 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
18330 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
18340 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
18350 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
18360 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
18370 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18380 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
18390 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
183a0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
183b0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
183c0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
183d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
183e0 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
183f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18400 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18410 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
18420 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
18430 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
18440 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18450 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
18460 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
18470 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
18480 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
18490 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
184a0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
184b0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
184c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
184d0 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
184e0 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
184f0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18500 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18510 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
18520 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
18530 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
18540 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
18550 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
18560 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18570 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
18580 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
18590 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
185a0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
185b0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
185c0 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
185d0 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
185e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
185f0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18600 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18610 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
18620 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18630 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18640 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
18650 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
18660 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
18670 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18680 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18690 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
186a0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
186b0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
186c0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
186d0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
186e0 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
186f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18700 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18710 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
18720 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
18730 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
18740 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
18750 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18760 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18780 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18790 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
187a0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
187b0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
187c0 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
187d0 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
187e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
187f0 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18800 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18810 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18820 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18830 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18840 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18860 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18870 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18880 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18890 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
188a0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
188b0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
188c0 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
188d0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
188e0 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
188f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18900 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18910 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18920 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18930 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18940 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18950 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
18960 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
18970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18980 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
18990 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
189a0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
189b0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
189c0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
189d0 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
189e0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
189f0 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18a00 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18a10 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18a20 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18a30 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18a40 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18a50 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
18a60 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
18a70 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
18a80 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
18a90 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
18aa0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
18ab0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18ac0 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18ad0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18ae0 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18af0 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18b00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18b10 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18b20 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18b30 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18b40 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18b50 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
18b60 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
18b70 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
18b80 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
18b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
18bb0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18bc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18bd0 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18be0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18c00 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18c10 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18c20 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18c30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18c40 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18c50 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
18c60 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
18c70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18c80 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
18c90 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
18ca0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
18cb0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18cc0 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18cd0 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18ce0 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18cf0 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18d00 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18d10 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18d20 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18d30 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18d40 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18d50 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
18d60 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
18d70 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
18d80 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
18d90 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
18da0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18db0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18dc0 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18dd0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18de0 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18df0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18e00 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18e10 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18e20 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18e30 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18e40 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18e50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18e60 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18e70 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
18e80 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
18e90 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18ea0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
18eb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18ec0 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18ed0 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18ee0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18ef0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18f00 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18f10 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18f20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18f30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18f40 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18f50 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
18f60 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
18f70 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
18f80 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
18f90 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
18fa0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
18fb0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18fc0 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
18fd0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
18fe0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
18ff0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
19010 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19030 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
19040 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
19050 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
19060 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
19070 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
19080 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
19090 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
190a0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
190b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
190c0 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
190d0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
190e0 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
190f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
19100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19110 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
19120 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
19130 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
19140 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
19150 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
19160 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19170 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
19180 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
19190 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
191a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
191b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
191c0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
191d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
191e0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
191f0 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
19200 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
19210 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
19220 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
19230 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
19240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19250 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19260 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19270 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
19280 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
19290 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
192a0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
192b0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
192c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
192d0 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
192e0 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
192f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19300 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
19310 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19320 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
19330 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
19340 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
19350 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
19360 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
19370 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
19380 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
19390 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
193a0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
193b0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
193c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
193d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
193e0 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
193f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19400 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
19410 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
19420 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
19430 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
19440 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
19450 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
19460 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19470 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
19480 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
19490 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
194a0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
194b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
194c0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
194d0 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
194e0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
194f0 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
19500 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
19510 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
19520 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
19530 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
19540 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
19550 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
19560 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
19570 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
19580 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
19590 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
195a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
195b0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
195c0 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
195d0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
195e0 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
195f0 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
19600 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
19610 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
19620 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
19630 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
19640 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
19650 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
19660 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
19670 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
19680 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
19690 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
196a0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
196b0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
196c0 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
196d0 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
196e0 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
196f0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
19700 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
19710 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
19720 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
19730 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
19740 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
19750 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
19760 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
19770 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
19780 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
19790 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
197a0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
197b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
197c0 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
197d0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
197e0 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
197f0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19800 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19810 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19830 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19840 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19850 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
19860 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
19870 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19880 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19890 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
198a0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
198b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
198c0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
198d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
198e0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
198f0 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19900 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19910 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19920 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19930 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
19940 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
19950 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
19960 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
19970 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
19980 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
19990 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
199a0 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
199b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
199c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
199d0 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
199e0 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
199f0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
19a00 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
19a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19a20 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
19a30 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
19a40 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
19a50 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
19a60 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19a70 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
19a80 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
19a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
19aa0 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
19ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19ac0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
19ad0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
19ae0 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
19af0 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e  else if( (curren
19b00 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e  tSize+szPage)<=n
19b10 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
19b20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70    char *pTmp = p
19b30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
19b40 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
19b50 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65  (pTmp, 0, szPage
19b60 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19b70 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19b80 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
19b90 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19ba0 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19bb0 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
19bc0 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19bd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19be0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19bf0 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
19c00 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
19c10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19c20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
19c40 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
19c50 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
19c60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
19c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19c80 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69  ** Return a sani
19c90 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  tized version of
19ca0 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
19cb0 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c   of OS file pFil
19cc0 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  e. The.** return
19cd0 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e   value is guaran
19ce0 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77  teed to lie betw
19cf0 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53  een 32 and MAX_S
19d00 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69  ECTOR_SIZE..*/.i
19d10 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72  nt sqlite3Sector
19d20 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
19d30 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
19d40 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f   iRet = sqlite3O
19d50 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c  sSectorSize(pFil
19d60 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33  e);.  if( iRet<3
19d70 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 ){.    iRet = 
19d80 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  512;.  }else if(
19d90 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52   iRet>MAX_SECTOR
19da0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
19db0 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
19dc0 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
19dd0 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54   iRet = MAX_SECT
19de0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
19df0 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f  eturn iRet;.}../
19e00 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
19e10 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
19e20 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
19e30 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
19e40 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
19e50 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
19e60 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
19e70 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
19e80 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
19e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
19ea0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
19eb0 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64  ill be used used
19ec0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
19ed0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
19ee0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
19ef0 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
19f00 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
19f10 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
19f20 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
19f30 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
19f40 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
19f50 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
19f60 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
19f70 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
19f80 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
19f90 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
19fa0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
19fb0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
19fc0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
19fd0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
19fe0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
19ff0 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
1a000 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
1a010 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
1a020 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
1a030 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
1a040 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
1a050 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1a060 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
1a070 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1a080 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c  file has the SQL
1a090 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a0a0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72  AFE_OVERWRITE pr
1a0b0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74  operty, then set
1a0c0 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76  .** the effectiv
1a0d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f  e sector size to
1a0e0 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   its minimum val
1a0f0 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70  ue (512).  The p
1a100 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61  urpose of.** pPa
1a110 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a120 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  is to define the
1a130 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20   "blast radius" 
1a140 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a  of bytes that.**
1a150 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66   might change if
1a160 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
1a170 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
1a180 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1a190 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e  n.** that range.
1a1a0 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52    But with POWER
1a1b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20  SAFE_OVERWRITE, 
1a1c0 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73  the blast radius
1a1d0 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61   is zero.** (tha
1a1e0 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53  t is what POWERS
1a1f0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65  AFE_OVERWRITE me
1a200 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69  ans), so we mini
1a210 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a  mize the sector.
1a220 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61  ** size.  For ba
1a230 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1a240 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c  ility of the rol
1a250 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
1a260 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65  le format,.** we
1a270 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74   cannot reduce t
1a280 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a290 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35  tor size below 5
1a2a0 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
1a2b0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
1a2c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a2d0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1a2e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1a2f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a300 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  e );..  if( pPag
1a310 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
1a320 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
1a330 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a340 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  cs(pPager->fd) &
1a350 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1a360 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a370 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a380 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1a390 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
1a3a0 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
1a3b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1a3c0 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
1a3d0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
1a3e0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1a3f0 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
1a400 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
1a410 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
1a420 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
1a430 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1a440 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
1a450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a460 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a470 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f  e = sqlite3Secto
1a480 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
1a490 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a4a0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
1a4b0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
1a4c0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
1a4d0 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
1a4e0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1a4f0 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
1a500 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
1a510 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
1a520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a530 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
1a540 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
1a550 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
1a560 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
1a570 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
1a580 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
1a590 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a5a0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a5b0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
1a5c0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
1a5d0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1a5e0 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
1a5f0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1a600 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
1a610 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
1a620 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
1a630 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1a640 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
1a650 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a660 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a670 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
1a680 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1a690 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1a6a0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1a6b0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1a6c0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1a6d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1a6e0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1a6f0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1a700 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1a710 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1a720 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a730 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a740 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1a750 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1a760 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1a770 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1a780 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1a790 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a7a0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a7b0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1a7c0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1a7d0 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1a7e0 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1a7f0 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1a800 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1a810 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1a820 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1a830 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1a840 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1a850 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1a860 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1a870 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1a880 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1a890 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1a8a0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1a8b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1a8c0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1a8d0 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1a8e0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1a8f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a900 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1a910 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1a920 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1a930 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1a940 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1a950 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1a960 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1a970 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1a980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1a990 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1a9a0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1a9b0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1a9c0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1a9d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1a9e0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1a9f0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1aa00 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1aa10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1aa20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1aa30 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1aa40 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1aa50 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1aa60 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1aa70 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1aa80 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1aa90 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1aaa0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1aab0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1aac0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1aad0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1aae0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1aaf0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1ab00 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1ab10 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1ab20 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1ab30 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1ab40 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1ab50 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1ab60 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1ab70 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1ab80 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1ab90 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1aba0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1abb0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1abc0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1abd0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1abe0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1abf0 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1ac00 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1ac10 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1ac20 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1ac30 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1ac40 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1ac50 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1ac60 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1ac70 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1ac80 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1ac90 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1aca0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1acb0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1acc0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1acd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ace0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1acf0 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1ad00 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1ad10 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1ad20 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1ad30 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1ad40 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1ad50 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1ad60 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1ad70 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1ad80 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1ad90 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1ada0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1adb0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1adc0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1add0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1ade0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1adf0 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1ae00 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1ae10 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1ae20 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1ae30 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1ae40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1ae50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1ae60 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1ae70 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1ae80 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1ae90 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1aea0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1aeb0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1aec0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1aed0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1aee0 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1aef0 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1af00 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1af10 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1af20 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1af30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1af40 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1af50 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1af60 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1af70 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1af80 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1af90 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1afa0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1afb0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1afc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1afd0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1afe0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1aff0 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1b000 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1b010 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1b020 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1b030 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b040 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b050 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1b060 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1b070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b080 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1b090 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1b0a0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0c0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b0d0 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1b0e0 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1b0f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b100 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1b110 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1b120 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b130 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b140 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1b150 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b160 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1b170 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1b180 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1b190 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1b1a0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1b1b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1b1c0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1b1d0 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1b1e0 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1b1f0 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1b200 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1b210 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1b220 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1b230 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62   */.  int nPlayb
1b240 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ack = 0;       /
1b250 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1b260 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64  f pages restored
1b270 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
1b280 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1b290 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1b2a0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1b2b0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1b2c0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1b2d0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1b2e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1b2f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b300 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1b310 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1b320 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1b330 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1b340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b350 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b360 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1b370 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1b380 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1b390 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1b3a0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1b3b0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1b3c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1b3d0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1b3e0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1b3f0 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1b400 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1b410 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1b420 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1b430 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1b440 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1b450 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1b460 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1b470 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1b480 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1b490 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1b4a0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1b4b0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1b4c0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1b4d0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1b4e0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1b4f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1b500 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1b510 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1b520 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1b530 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1b540 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1b550 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1b560 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1b570 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1b580 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1b590 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1b5a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1b5b0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1b5c0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1b5d0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1b5e0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1b5f0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1b600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b610 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1b620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b630 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1b640 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1b650 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1b660 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1b670 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1b680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1b690 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1b6a0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b6b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1b6c0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1b6d0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1b6e0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1b6f0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1b700 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1b710 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1b720 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1b730 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1b740 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1b750 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1b760 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1b770 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1b780 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1b790 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1b7a0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1b7b0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b7c0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1b7d0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1b7e0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1b7f0 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1b800 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1b810 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1b820 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1b830 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1b840 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1b850 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1b860 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1b870 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1b880 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1b890 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1b8a0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1b8b0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1b8c0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1b8d0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1b8e0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1b8f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b900 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1b910 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b920 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b930 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1b940 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b950 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1b960 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1b970 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b980 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1b990 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1b9a0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1b9b0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1b9c0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1b9d0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1b9e0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b9f0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1ba00 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1ba10 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1ba20 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1ba30 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1ba40 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1ba50 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1ba60 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1ba70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1ba80 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1ba90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1baa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bab0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1bac0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1bad0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1bae0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1baf0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1bb00 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1bb10 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1bb20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1bb30 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1bb40 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1bb50 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1bb60 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1bb70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1bb80 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1bb90 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1bba0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1bbb0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1bbc0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1bbd0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bbe0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1bbf0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1bc00 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1bc10 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1bc20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1bc30 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1bc40 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1bc50 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1bc60 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1bc70 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1bc80 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1bc90 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1bca0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1bcb0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1bcc0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1bcd0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1bce0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1bcf0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1bd00 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1bd10 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1bd20 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1bd30 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1bd40 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1bd50 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1bd60 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1bd70 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1bd80 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1bd90 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1bda0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1bdb0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1bdc0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1bdd0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1bde0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1bdf0 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1be00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1be10 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1be20 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1be30 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1be40 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1be50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1be60 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1be70 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1be80 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1be90 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1bea0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1beb0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1bec0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1bed0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1bee0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1bef0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1bf00 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1bf10 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1bf20 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1bf30 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1bf40 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1bf50 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1bf60 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1bf70 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1bf80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bf90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bfa0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1bfb0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1bfc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1bfd0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1bfe0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1bff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c000 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c010 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c020 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c030 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c040 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c050 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c060 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c070 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c080 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c090 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c0a0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c0b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c0c0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c0d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c0e0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c0f0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c100 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c110 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c120 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c130 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c140 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c150 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c160 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c170 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c190 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c1a0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c1b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c1c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c1e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c1f0 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c210 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c220 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c230 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c240 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c250 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c260 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c270 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c280 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c290 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c2a0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c2b0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c2c0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c2d0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c2e0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1c2f0 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1c300 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1c310 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1c320 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1c330 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1c340 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1c350 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1c360 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1c370 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1c380 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1c390 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1c3a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1c3b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c3c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c3d0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c3e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c3f0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1c400 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1c410 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1c420 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1c430 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1c440 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1c450 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1c460 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1c470 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1c480 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1c490 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1c4a0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1c4b0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1c4c0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1c4d0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1c4e0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1c4f0 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1c500 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1c510 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1c520 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c540 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1c550 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1c560 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1c570 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1c580 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1c590 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1c5a0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1c5b0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1c5c0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1c5d0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1c5e0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1c5f0 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1c600 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1c610 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1c620 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1c630 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1c640 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1c650 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1c660 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1c670 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1c680 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1c690 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1c6a0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1c6b0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1c6c0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1c6d0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1c6e0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1c6f0 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1c700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1c710 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1c720 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1c730 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1c740 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1c750 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1c760 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1c770 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1c780 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1c790 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1c7a0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1c7b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1c7c0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1c7d0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1c7e0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1c7f0 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1c800 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1c810 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1c820 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1c830 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1c840 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1c850 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1c860 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1c870 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1c880 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1c890 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1c8a0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1c8b0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1c8c0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1c8d0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1c8e0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1c8f0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1c900 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1c910 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1c920 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1c930 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1c940 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1c950 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1c960 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1c970 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1c980 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1c990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c9a0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1c9b0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1c9c0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1c9d0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1c9e0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1c9f0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1ca00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1ca10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1ca20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ca30 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1ca40 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1ca50 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1ca60 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1ca70 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1ca80 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1ca90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1caa0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1cab0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1cac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cad0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1cae0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1caf0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1cb00 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1cb10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cb20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cb30 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cb40 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1cb50 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1cb60 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1cb70 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1cb80 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1cb90 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1cba0 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1cbb0 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1cbc0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1cbd0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1cbe0 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1cbf0 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1cc00 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1cc10 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1cc20 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cc30 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1cc40 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1cc50 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1cc60 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1cc70 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1cc80 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1cc90 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1cca0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ccb0 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1ccc0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1ccd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1cce0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1ccf0 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1cd00 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1cd10 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1cd20 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1cd30 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1cd40 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1cd50 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1cd60 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1cd70 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1cd80 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1cd90 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1cda0 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1cdb0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1cdc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1cdd0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1cde0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1cdf0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1ce00 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
1ce10 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1ce20 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1ce30 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1ce40 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1ce50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1ce60 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1ce70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ce80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1ce90 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1cea0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1ceb0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1cec0 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1ced0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1cee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cef0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1cf00 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1cf10 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1cf20 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1cf30 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1cf40 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1cf50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1cf60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1cf70 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1cf80 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61  r *pPg, u32 iFra
1cf90 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  me){.  Pager *pP
1cfa0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1cfb0 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1cfc0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1cfd0 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1cfe0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1cff0 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1d000 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1d010 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1d020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1d030 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d040 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1d050 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70  pgsz = pPager->p
1d060 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62  ageSize; /* Numb
1d070 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
1d080 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
1d090 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1d0a0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1d0b0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1d0c0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1d0d0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
1d0e0 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
1d0f0 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
1d100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d110 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1d120 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
1d130 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
1d140 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1d150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d160 4f 4b 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  OK;.  }..#ifndef
1d170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d180 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b  .  if( iFrame ){
1d190 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1d1a0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1d1b0 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1d1c0 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1d1d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1d1e0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1d1f0 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73  Wal, iFrame, pgs
1d200 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  z, pPg->pData);.
1d210 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1d220 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73   {.    i64 iOffs
1d230 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1d240 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1d250 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
1d260 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1d270 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
1d280 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65  ta, pgsz, iOffse
1d290 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1d2a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1d2b0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1d2c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d2d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d2e0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1d2f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d300 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
1d310 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
1d320 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
1d330 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
1d340 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
1d350 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
1d360 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
1d370 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
1d380 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
1d390 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
1d3a0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1d3b0 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
1d3c0 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
1d3d0 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
1d3e0 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ero or the size 
1d3f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d400 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33  in page. Bytes 3
1d410 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39  2..35 and 35..39
1d420 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
1d430 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73   be page numbers
1d440 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72   which are never
1d450 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f   0xffffffff.  So
1d460 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   filling.      *
1d470 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  * pPager->dbFile
1d480 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20  Vers[] with all 
1d490 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c  0xff bytes shoul
1d4a0 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20  d suffice..     
1d4b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1d4c0 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
1d4d0 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75  tabase, the situ
1d4e0 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
1d4f0 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20  mplex:  bytes.  
1d500 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66      ** 24..39 of
1d510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
1d520 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20  e white noise.  
1d530 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c  But the probabil
1d540 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ity of.      ** 
1d550 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71  white noising eq
1d560 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1d570 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1d580 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1d590 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1d5a0 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1d5b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1d5c0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1d5d0 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1d5e0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1d5f0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1d600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1d610 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1d620 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1d630 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1d640 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1d650 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1d660 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1d670 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d680 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1d690 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1d6a0 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1d6b0 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1d6c0 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  MEM);..  PAGER_I
1d6d0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1d6e0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1d6f0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1d700 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1d710 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1d720 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1d730 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1d740 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1d750 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1d760 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1d770 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1d780 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1d790 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1d7a0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1d7b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1d7c0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1d7d0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d7e0 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1d7f0 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1d800 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1d810 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1d820 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1d830 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1d840 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1d850 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1d860 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1d870 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1d880 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1d890 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1d8a0 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1d8b0 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1d8c0 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1d8d0 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1d8e0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1d8f0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1d900 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1d910 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1d920 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1d930 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1d940 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1d950 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1d960 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1d970 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1d980 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1d990 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1d9a0 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1d9b0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1d9c0 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1d9d0 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1d9e0 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1d9f0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1da00 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1da10 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1da20 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1da30 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1da40 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1da50 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1da60 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1da70 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1da80 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1da90 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1daa0 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1dab0 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1dac0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1dad0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1dae0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1daf0 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1db00 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1db10 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1db20 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1db30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1db40 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1db50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1db60 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1db70 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1db80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1db90 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1dba0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1dbb0 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1dbc0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1dbd0 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1dbe0 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1dbf0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1dc00 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1dc10 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1dc20 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1dc30 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1dc40 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1dc50 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1dc60 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1dc70 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1dc80 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1dc90 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1dca0 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1dcb0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1dcc0 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1dcd0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1dce0 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1dcf0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1dd00 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1dd10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1dd20 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1dd30 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1dd40 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1dd50 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1dd60 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1dd70 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1dd80 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1dd90 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1dda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ddb0 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1ddc0 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1ddd0 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1dde0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ddf0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1de00 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1de10 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1de20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1de30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1de40 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1de50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1de60 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1de70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1de80 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1de90 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1dea0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1deb0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1dec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ded0 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1dee0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1def0 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
1df00 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1df10 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d  Pg->pgno, &iFram
1df20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1df30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1df40 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
1df50 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
1df60 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1df70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1df80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1df90 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1dfa0 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1dfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1dfc0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1dfd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1dfe0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1dff0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e000 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1e010 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1e020 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1e030 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1e040 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1e050 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1e060 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1e070 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1e080 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1e090 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1e0a0 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1e0b0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1e0c0 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1e0d0 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1e0e0 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1e0f0 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1e100 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1e110 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1e120 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1e130 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1e140 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1e150 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1e160 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1e170 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1e180 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1e190 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1e1a0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1e1b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1e1c0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1e1d0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1e1e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e1f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e200 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1e210 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1e220 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1e230 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1e240 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1e250 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1e260 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e290 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1e2a0 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2c0 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1e2d0 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1e2e0 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1e2f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1e300 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1e310 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1e320 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1e330 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1e340 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1e350 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1e360 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1e370 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1e380 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1e390 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1e3a0 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1e3b0 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1e3c0 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1e3d0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1e3e0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1e3f0 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1e400 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1e410 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1e420 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1e430 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1e440 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1e450 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1e460 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1e470 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1e480 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1e490 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1e4a0 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1e4b0 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1e4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1e4d0 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1e4e0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1e4f0 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1e500 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1e510 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1e520 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1e530 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1e540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e560 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1e570 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1e580 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1e590 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1e5a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e5b0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1e5c0 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1e5d0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1e5e0 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1e5f0 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1e600 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1e610 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1e620 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1e630 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1e640 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1e650 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1e660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e670 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1e680 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1e690 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1e6a0 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1e6b0 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1e6c0 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1e6d0 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1e6e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1e6f0 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1e700 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1e710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1e720 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1e730 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1e760 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1e770 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e790 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1e7a0 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1e7b0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1e7c0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1e7d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e7e0 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1e7f0 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1e800 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e820 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e830 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e850 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e860 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69  s in pList */.#i
1e870 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e880 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1e890 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ed(SQLITE_CHECK_
1e8a0 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a  PAGES).  PgHdr *
1e8b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1e8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1e8d0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1e8e0 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  es */.#endif..  
1e8f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e900 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1e910 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1e920 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e930 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1e940 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1e950 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1e960 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1e970 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1e980 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1e990 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1e9a0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1e9b0 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1e9c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1e9d0 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1e9e0 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1e9f0 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1ea00 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1ea10 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ea20 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1ea30 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1ea40 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1ea50 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1ea60 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1ea70 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1ea80 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1ea90 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1eaa0 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1eab0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1eac0 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1ead0 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1eae0 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1eaf0 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1eb00 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
1eb10 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78     PgHdr **ppNex
1eb20 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20  t = &pList;.    
1eb30 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66  nList = 0;.    f
1eb40 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70  or(p=pList; (*pp
1eb50 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d  Next = p)!=0; p=
1eb60 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1eb70 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e    if( p->pgno<=n
1eb80 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1eb90 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d      ppNext = &p-
1eba0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20  >pDirty;.       
1ebb0 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20   nList++;.      
1ebc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1ebd0 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d  rt( pList );.  }
1ebe0 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20  else{.    nList 
1ebf0 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 1;.  }.  pPage
1ec00 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
1ec10 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c  TAT_WRITE] += nL
1ec20 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73  ist;..  if( pLis
1ec30 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
1ec40 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1ec50 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20  ounter(pList);. 
1ec60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1ec70 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1ec80 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67  Wal, .      pPag
1ec90 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c  er->pageSize, pL
1eca0 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20  ist, nTruncate, 
1ecb0 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72  isCommit, pPager
1ecc0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20  ->walSyncFlags. 
1ecd0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1ece0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1ecf0 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
1ed00 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1ed10 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1ed20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1ed30 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1ed40 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1ed50 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1ed60 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1ed70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1ed80 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1ed90 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1eda0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1edb0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1edc0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1edd0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1ede0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1edf0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1ee00 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1ee10 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ee20 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1ee30 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ee40 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1ee50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ee60 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1ee70 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1ee80 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1ee90 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1eea0 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1eeb0 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1eec0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1eed0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1eee0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1eef0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1ef00 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1ef10 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1ef20 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1ef30 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1ef40 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1ef50 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1ef60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1ef70 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1ef80 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1ef90 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1efc0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1efd0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1efe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1eff0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1f000 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1f010 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f020 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f030 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f040 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f050 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1f060 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1f070 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1f080 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f090 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1f0a0 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1f0b0 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1f0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1f0d0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1f0e0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1f0f0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1f100 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1f110 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1f120 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1f130 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1f140 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1f150 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1f160 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1f170 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f180 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f190 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1f1a0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1f1b0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f1c0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1f1d0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1f1e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f1f0 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1f200 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1f210 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1f220 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1f230 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1f240 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1f250 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1f260 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1f270 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f280 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f290 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1f2a0 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1f2b0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1f2c0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1f2d0 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1f2e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f2f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1f300 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1f310 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1f320 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1f330 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1f340 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1f350 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f360 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f370 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1f380 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f390 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1f3a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1f3b0 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1f3c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1f3d0 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1f3e0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1f3f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f400 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f410 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1f420 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1f430 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1f440 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1f450 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1f460 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f470 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1f480 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1f490 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1f4a0 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1f4b0 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1f4c0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1f4d0 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1f4e0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1f4f0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1f500 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1f510 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1f520 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1f530 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f540 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1f550 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1f560 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1f570 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1f580 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f590 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1f5a0 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1f5b0 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1f5c0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1f5d0 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1f5e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f5f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f600 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f620 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f630 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1f640 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1f650 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1f660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
1f670 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1f680 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1f690 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1f6a0 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65  ystem,.  ** dete
1f6b0 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f  rmine it based o
1f6c0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1f6d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f6e0 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a   If the size.  *
1f6f0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
1f700 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1f710 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1f720 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1f730 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64  ze,.  ** round d
1f740 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65  own to the neare
1f750 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c  st page. Except,
1f760 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72   any file larger
1f770 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74   than 0.  ** byt
1f780 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
1f790 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74  nsidered to cont
1f7a0 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
1f7b0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1f7c0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1f7d0 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
1f800 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1f810 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1f820 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1f830 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1f840 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
1f850 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1f860 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1f870 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1f880 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1f890 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
1f8a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f8b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f8c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f8d0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
1f8e0 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
1f8f0 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
1f900 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f910 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f920 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
1f930 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1f940 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
1f950 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
1f960 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
1f970 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
1f980 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1f990 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
1f9a0 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1f9b0 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
1f9c0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
1f9d0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1f9e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1f9f0 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
1fa00 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
1fa10 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1fa20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fa30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fa40 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
1fa50 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
1fa60 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
1fa70 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
1fa80 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1fa90 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
1faa0 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
1fab0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
1fac0 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
1fad0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1fae0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
1faf0 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
1fb00 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1fb10 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
1fb20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1fb30 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1fb40 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
1fb50 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
1fb60 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
1fb70 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
1fb80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1fb90 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
1fba0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1fbb0 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
1fbc0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
1fbd0 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
1fbe0 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
1fbf0 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
1fc00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
1fc10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1fc20 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
1fc30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1fc40 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1fc50 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
1fc60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1fc70 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
1fc80 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1fc90 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
1fca0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1fcb0 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
1fcc0 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
1fcd0 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
1fce0 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
1fcf0 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
1fd00 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
1fd10 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
1fd20 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
1fd30 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
1fd40 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
1fd50 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
1fd60 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
1fd70 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1fd80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
1fd90 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
1fda0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1fdb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fdc0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1fdd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1fde0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1fdf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fe00 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1fe10 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
1fe20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1fe30 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
1fe60 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
1fe70 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1fea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1feb0 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
1fec0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1fed0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1fee0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1fef0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1ff00 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1ff10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1ff20 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1ff30 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1ff40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1ff50 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  ==SQLITE_IOERR_D
1ff60 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63  ELETE_NOENT ) rc
1ff70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ff80 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20      isWal = 0;. 
1ff90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ffa0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1ffb0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
1ffc0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1ffd0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
1ffe0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1fff0 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29  , &isWal.      )
20000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20020 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
20030 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
20040 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
20050 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
20060 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
20070 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
20080 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
20090 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
200a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
200b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
200c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
200d0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
200e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
200f0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
20100 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
20110 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
20120 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20130 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
20140 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
20150 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
20160 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
20170 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
20180 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
20190 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
201a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
201b0 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
201c0 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
201d0 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
201e0 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
201f0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
20200 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
20210 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
20220 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
20230 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
20240 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
20250 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
20260 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
20270 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
20280 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
20290 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
202a0 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
202b0 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
202c0 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
202d0 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
202e0 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
202f0 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
20300 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
20310 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
20320 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
20330 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
20340 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
20350 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
20360 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
20370 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
20380 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
20390 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
203a0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
203b0 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
203c0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
203d0 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
203e0 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
203f0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20400 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
20410 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
20420 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
20430 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
20440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
20450 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
20460 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
20470 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20480 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
20490 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
204a0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
204b0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
204c0 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
204d0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
204e0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
204f0 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
20500 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
20510 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
20520 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20530 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
20540 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
20550 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
20560 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
20570 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
20580 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
20590 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
205a0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
205b0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
205c0 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
205d0 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
205e0 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
205f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
20600 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
20610 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
20620 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
20630 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
20640 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
20650 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20660 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
20670 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
20680 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
20690 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
206a0 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
206b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
206c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
206d0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
206e0 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
206f0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
20700 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
20710 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
20720 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
20730 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
20740 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
20750 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
20760 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
20770 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
20780 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
20790 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
207a0 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
207b0 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
207c0 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
207d0 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
207e0 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
207f0 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
20800 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
20810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20820 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
20830 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
20840 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
20850 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
20860 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20880 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
20890 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
208a0 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
208b0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
208c0 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
208d0 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
208e0 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
208f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
20900 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
20910 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
20920 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
20930 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
20940 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
20950 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
20960 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
20970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20980 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
20990 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
209a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
209b0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
209c0 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
209d0 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
209e0 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
209f0 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
20a00 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
20a10 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20a20 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
20a30 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
20a40 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
20a50 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
20a60 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
20a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
20a90 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
20aa0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
20ab0 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
20ac0 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
20ad0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
20ae0 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
20af0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
20b00 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
20b10 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
20b20 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
20b30 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
20b40 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
20b50 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
20b60 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
20b70 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
20b80 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
20b90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
20bb0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
20bc0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
20bd0 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
20be0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
20bf0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
20c00 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
20c10 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
20c20 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
20c30 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
20c40 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
20c50 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
20c60 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20c70 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
20c80 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
20c90 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
20ca0 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
20cb0 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
20cc0 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
20cd0 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
20ce0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
20cf0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
20d00 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
20d10 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
20d20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
20d30 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20d40 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
20d50 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20d60 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
20d70 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
20d80 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20d90 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
20da0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
20db0 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
20dc0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
20dd0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
20de0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
20df0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
20e00 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
20e10 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
20e20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
20e30 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
20e40 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
20e50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
20e60 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
20e70 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
20e80 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
20e90 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
20ea0 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
20eb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20ec0 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
20ed0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
20ee0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
20ef0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20f00 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
20f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20f20 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
20f30 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
20f40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
20f50 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
20f60 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
20f70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
20f80 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
20f90 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
20fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20fb0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
20fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20fd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
20fe0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
20ff0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21000 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
21010 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
21020 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21030 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
21040 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
21050 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
21060 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
21070 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
21080 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
21090 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
210a0 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
210b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
210c0 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
210d0 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
210e0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
210f0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
21100 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21110 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
21120 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21130 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
21140 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21150 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21170 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21180 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
21190 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
211a0 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
211b0 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
211c0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
211d0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
211e0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
211f0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
21200 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21210 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
21220 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
21230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21240 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21250 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21260 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
21270 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
21280 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
21290 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
212a0 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
212b0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
212c0 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
212d0 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
212e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
212f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
21300 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
21310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21320 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21330 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21340 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
21350 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
21360 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
21370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21380 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
21390 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
213a0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
213b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
213c0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
213d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
213e0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
213f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21400 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21410 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21420 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21430 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21440 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21450 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21460 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21470 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21480 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21490 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
214a0 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
214b0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
214c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
214d0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
214e0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
214f0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
21500 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21510 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
21520 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
21530 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
21540 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
21550 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21560 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21570 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21580 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21590 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
215a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
215b0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
215c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
215d0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
215e0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
215f0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
21600 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
21610 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
21620 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
21630 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
21640 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
21650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21660 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
21670 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
21680 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
21690 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
216a0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
216b0 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
216c0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
216d0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
216e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
216f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21700 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
21710 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
21720 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21730 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21740 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
21750 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
21760 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
21770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21780 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21790 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
217a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
217b0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
217c0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
217d0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
217e0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
217f0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
21800 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
21810 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
21820 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
21830 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
21840 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
21850 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
21860 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
21870 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43  Invoke SQLITE_FC
21880 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61  NTL_MMAP_SIZE ba
21890 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  sed on the curre
218a0 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d  nt value of szMm
218b0 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ap..*/.static vo
218c0 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  id pagerFixMapli
218d0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
218e0 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  r){.#if SQLITE_M
218f0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
21900 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
21910 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
21920 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29    if( isOpen(fd)
21930 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73   && fd->pMethods
21940 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b  ->iVersion>=3 ){
21950 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
21960 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20  64 sz;.    sz = 
21970 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a  pPager->szMmap;.
21980 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65      pPager->bUse
21990 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a  Fetch = (sz>0);.
219a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
219b0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
219c0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
219d0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
219e0 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   &sz);.  }.#endi
219f0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  f.}../*.** Chang
21a00 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  e the maximum si
21a10 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79  ze of any memory
21a20 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66   mapping made of
21a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21a40 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
21a50 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
21a60 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
21a70 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  er, sqlite3_int6
21a80 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61  4 szMmap){.  pPa
21a90 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a  ger->szMmap = sz
21aa0 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78  Mmap;.  pagerFix
21ab0 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
21ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
21ad0 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
21ae0 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
21af0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f  the pager..*/.vo
21b00 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
21b10 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61  hrink(Pager *pPa
21b20 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
21b30 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67  cacheShrink(pPag
21b40 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
21b50 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65  ./*.** Adjust se
21b60 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  ttings of the pa
21b70 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65  ger to those spe
21b80 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67  cified in the pg
21b90 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  Flags parameter.
21ba0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65  .**.** The "leve
21bb0 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20  l" in pgFlags & 
21bc0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
21bd0 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20  S_MASK sets the 
21be0 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66  robustness.** of
21bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
21c00 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
21c10 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77  S crashes or pow
21c20 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a  er failures by.*
21c30 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  * changing the n
21c40 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
21c50 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  s when writing t
21c60 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  he journals..** 
21c70 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
21c80 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
21c90 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
21ca0 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
21cb0 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
21cc0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
21cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21ce0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
21cf0 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
21d00 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
21d10 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
21d20 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
21d30 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
21d40 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
21d60 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
21d70 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
21d80 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
21d90 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
21da0 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
21db0 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
21dc0 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
21dd0 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
21de0 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
21df0 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
21e00 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
21e10 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
21e20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
21e30 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
21e40 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
21e50 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
21e60 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
21e70 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
21e80 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
21e90 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
21ea0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
21eb0 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
21ec0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
21ed0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
21ee0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
21ef0 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
21f00 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
21f10 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
21f20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21f30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21f40 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
21f50 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
21f60 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
21f70 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
21f80 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
21f90 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
21fa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
21fb0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
21fc0 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
21fd0 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
21fe0 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
21ff0 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
22000 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
22010 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
22020 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
22040 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
22050 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
22060 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
22070 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  back..**.** The 
22080 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72  above is for a r
22090 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20  ollback-journal 
220a0 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d  mode.  For WAL m
220b0 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75  ode, OFF continu
220c0 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68  es.** to mean th
220d0 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72  at no syncs ever
220e0 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20   occur.  NORMAL 
220f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
22100 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  AL is synced.** 
22110 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
22120 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74  rt of checkpoint
22130 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
22140 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73  tabase file is s
22150 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  ynced.** at the 
22160 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
22170 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  e checkpoint if 
22180 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
22190 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a  nt of the WAL.**
221a0 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63   was written bac
221b0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
221c0 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e  ase.  But no syn
221d0 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  c operations occ
221e0 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64  ur for.** an ord
221f0 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20  inary commit in 
22200 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68  NORMAL mode with
22210 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e   WAL.  FULL mean
22220 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a  s that the WAL.*
22230 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  * file is synced
22240 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20   following each 
22250 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e  commit operation
22260 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f  , in addition to
22270 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73   the.** syncs as
22280 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f  sociated with NO
22290 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  RMAL..**.** Do n
222a0 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68  ot confuse synch
222b0 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68  ronous=FULL with
222c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
222d0 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  L.  The.** SQLIT
222e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72  E_SYNC_FULL macr
222f0 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74  o means to use t
22300 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20  he MacOSX-style 
22310 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73  full-fsync.** us
22320 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c  ing fcntl(F_FULL
22330 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f  FSYNC).  SQLITE_
22340 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e  SYNC_NORMAL mean
22350 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72  s to do an.** or
22360 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63  dinary fsync() c
22370 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e  all.  There is n
22380 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  o difference bet
22390 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43  ween SQLITE_SYNC
223a0 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c  _FULL.** and SQL
223b0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
223c0 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68  on platforms oth
223d0 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20  er than MacOSX. 
223e0 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63   But the.** sync
223f0 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72  hronous=FULL ver
22400 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  sus synchronous=
22410 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64  NORMAL setting d
22420 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a  etermines when.*
22430 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d  * the xSync prim
22440 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20  itive is called 
22450 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20  and is relevant 
22460 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73  to all platforms
22470 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
22480 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
22490 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
224a0 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
224b0 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
224c0 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
224d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
224e0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
224f0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22500 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72  etFlags(.  Pager
22510 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22520 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
22530 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
22540 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  l for */.  unsig
22550 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
22560 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
22570 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  s */.){.  unsign
22580 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61  ed level = pgFla
22590 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
225a0 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61  RONOUS_MASK;.  a
225b0 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20  ssert( level>=1 
225c0 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20  && level<=3 );. 
225d0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
225e0 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
225f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22600 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
22610 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
22620 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
22630 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
22640 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
22650 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
22660 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22670 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
22680 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22690 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
226a0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
226b0 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
226c0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
226d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
226e0 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67  C_FULL;.    pPag
226f0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22700 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22710 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  FULL;.  }else if
22720 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22730 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43  R_CKPT_FULLFSYNC
22740 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22750 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22760 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22770 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22780 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
22790 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
227a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
227b0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
227c0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
227d0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
227e0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
227f0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22800 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  L;.  }.  pPager-
22810 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
22820 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22830 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  s;.  if( pPager-
22840 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
22850 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
22860 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e  Flags |= WAL_SYN
22870 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
22880 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
22890 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
228a0 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
228b0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
228c0 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
228d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
228e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
228f0 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
22900 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
22910 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
22920 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
22930 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
22940 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
22950 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
22960 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
22970 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
22980 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
22990 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
229a0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
229b0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
229c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
229d0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
229e0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
229f0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
22a00 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
22a10 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
22a20 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
22a30 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
22a40 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
22a50 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22a60 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
22a70 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
22a80 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
22a90 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
22aa0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
22ab0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
22ac0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
22ad0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
22ae0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
22af0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
22b00 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
22b10 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
22b20 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
22b30 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
22b40 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
22b50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
22b60 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
22b70 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22b80 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
22b90 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
22ba0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
22bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22bc0 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
22bd0 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
22be0 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
22bf0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
22c00 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
22c10 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
22c20 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
22c30 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
22c40 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
22c50 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
22c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
22c70 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
22c80 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
22c90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
22ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22cb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
22cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
22cd0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
22ce0 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
22cf0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
22d00 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
22d10 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
22d20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
22d30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22d40 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
22d50 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
22d60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22d70 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
22d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22d90 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
22da0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
22db0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
22dc0 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
22dd0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
22de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22df0 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
22e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22e10 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
22e20 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
22e30 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
22e40 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
22e50 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
22e60 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
22e70 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
22e80 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
22e90 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
22ea0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
22eb0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
22ec0 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
22ed0 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
22ee0 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
22ef0 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
22f00 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
22f10 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
22f20 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
22f30 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
22f40 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
22f50 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
22f60 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
22f70 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
22f80 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
22f90 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
22fa0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
22fb0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
22fc0 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
22fd0 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
22fe0 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
22ff0 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
23000 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
23010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
23040 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
23050 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
23060 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
23070 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
23080 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
23090 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
230a0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
230b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
230c0 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
230d0 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
230e0 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
230f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
23100 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
23110 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
23120 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
23130 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
23140 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
23150 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
23160 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
23170 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
23180 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
23190 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
231a0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
231b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
231c0 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
231d0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
23200 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
23210 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
23220 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
23230 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
23240 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
23250 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
23260 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
23270 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
23280 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
23290 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
232a0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
232b0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
232c0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
232d0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
232e0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
232f0 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
23300 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23310 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
23320 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
23330 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
23340 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
23350 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
23360 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
23370 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
23380 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
23390 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
233a0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
233b0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
233c0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
233d0 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
233e0 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
233f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
23400 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
23410 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
23420 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
23430 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
23440 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
23450 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23460 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
23470 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
23480 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
23490 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
234a0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
234b0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
234c0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
234d0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
234e0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
234f0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
23500 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
23510 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
23520 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
23530 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23540 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
23550 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
23560 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
23570 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
23580 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
23590 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
235a0 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
235b0 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
235c0 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
235d0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
235e0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
235f0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
23600 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
23610 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
23620 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
23630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
23640 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
23650 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23660 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
23670 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
23680 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
23690 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
236a0 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
236b0 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
236c0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
236d0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
236e0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
236f0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
23700 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
23710 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23720 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
23730 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
23740 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
23750 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
23760 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
23770 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23780 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
23790 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
237a0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
237b0 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
237c0 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
237d0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
237e0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
237f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
23800 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
23810 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
23820 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
23830 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
23840 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
23850 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
23860 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
23870 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
23880 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
23890 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
238a0 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
238b0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
238c0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
238d0 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
238e0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
238f0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
23900 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
23910 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
23920 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
23930 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
23940 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23950 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
23960 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
23970 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23980 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
23990 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
239a0 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
239b0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
239c0 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
239d0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
239e0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
239f0 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
23a00 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
23a10 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
23a20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
23a30 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
23a40 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
23a50 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
23a60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
23a70 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
23a80 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
23a90 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
23aa0 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
23ab0 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
23ac0 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
23ad0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
23ae0 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
23af0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
23b00 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
23b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
23b20 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
23b30 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
23b40 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
23b50 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
23b60 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
23b70 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
23b80 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
23b90 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
23ba0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
23bb0 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
23bc0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
23bd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
23be0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
23bf0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
23c00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
23c10 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
23c20 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
23c30 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
23c40 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
23c50 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
23c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23c70 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
23c80 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
23c90 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
23ca0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
23cb0 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
23cc0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23cd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23ce0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
23cf0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
23d00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
23d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23d20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
23d30 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
23d40 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
23d50 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
23d60 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
23d70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
23d80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23da0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
23db0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
23dc0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
23dd0 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
23de0 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
23df0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23e00 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
23e10 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
23e20 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
23e30 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
23e40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
23e50 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
23e60 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
23e70 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
23e80 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
23e90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
23ea0 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
23eb0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
23ec0 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
23ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ee0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
23ef0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
23f00 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
23f10 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
23f20 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
23f30 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
23f40 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
23f50 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
23f60 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
23f70 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
23f80 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
23f90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
23fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23fb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
23fc0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
23fd0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
23fe0 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
23ff0 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
24000 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
24010 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
24020 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
24030 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
24040 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
24050 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
24060 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
24070 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
24080 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
24090 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
240a0 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
240b0 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
240c0 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
240d0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
240e0 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
240f0 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
24100 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
24110 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
24120 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
24130 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
24140 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
24150 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
24160 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
24170 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
24180 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
24190 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
241a0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
241b0 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
241c0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
241d0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
241e0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
241f0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
24200 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
24210 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
24220 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
24230 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
24240 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
24250 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
24260 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
24270 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
24280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24290 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
242a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
242b0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
242c0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
242d0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
242e0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
242f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24300 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
24310 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
24320 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
24330 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
24340 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
24350 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
24360 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
24370 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
24380 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
24390 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
243a0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
243b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
243c0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
243d0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
243e0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
243f0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
24400 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
24410 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
24420 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
24430 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
24440 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
24450 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
24460 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
24470 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
24480 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
24490 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
244a0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
244b0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
244c0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
244d0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
244e0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
244f0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
24500 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24510 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
24520 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
24530 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
24540 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24550 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
24560 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
24570 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24580 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
24590 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
245a0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
245b0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
245c0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
245d0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
245e0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
245f0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
24600 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
24610 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24620 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
24630 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
24640 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
24650 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
24660 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
24670 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
24680 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
24690 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
246a0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
246b0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
246c0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
246d0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
246e0 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
246f0 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
24700 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
24710 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
24720 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
24730 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
24740 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
24750 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24760 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
24770 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
24780 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
24790 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
247a0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
247b0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
247c0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
247d0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
247e0 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
247f0 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
24800 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
24810 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
24820 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
24830 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
24840 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
24850 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
24860 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
24870 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
24880 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
24890 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
248a0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
248b0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
248c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
248d0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
248e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
248f0 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
24900 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
24910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24920 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
24930 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
24940 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24950 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
24960 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
24970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
24980 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
24990 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
249a0 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
249b0 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
249c0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
249d0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
249e0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
249f0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
24a00 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
24a10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
24a20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
24a30 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
24a40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24a50 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
24a60 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
24a70 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
24a80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24a90 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
24aa0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
24ab0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24ac0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
24ad0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
24ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24af0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24b00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
24b10 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
24b20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
24b30 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
24b40 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
24b50 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
24b60 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
24b70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
24b80 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
24b90 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
24ba0 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
24bb0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
24bc0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
24bd0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
24be0 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
24bf0 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
24c00 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
24c10 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
24c20 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
24c30 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
24c40 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
24c50 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
24c60 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
24c70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24c80 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
24c90 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
24ca0 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
24cb0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
24cc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
24cd0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
24ce0 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
24cf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24d00 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
24d10 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
24d20 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
24d30 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
24d40 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
24d50 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
24d60 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
24d70 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
24d80 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
24d90 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
24da0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
24db0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
24dc0 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
24dd0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
24de0 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
24df0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
24e00 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
24e10 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
24e20 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
24e30 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
24e40 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
24e50 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
24e60 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
24e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
24e80 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
24e90 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
24ea0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
24eb0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
24ec0 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
24ed0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
24ee0 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
24ef0 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
24f00 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
24f10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
24f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
24f30 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
24f40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24f50 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
24f60 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24f90 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
24fa0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
24fb0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
24fc0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
24fd0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
24fe0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
24ff0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
25000 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
25010 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
25020 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
25030 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
25040 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
25050 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
25060 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
25070 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
25080 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25090 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
250a0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
250b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
250c0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
250d0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
250e0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
250f0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
25100 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
25110 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
25120 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
25130 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
25140 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
25150 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
25160 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
25170 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
25180 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
25190 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
251a0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
251b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
251c0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
251d0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
251e0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
251f0 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
25200 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
25210 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
25220 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
25230 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
25240 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
25250 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
25260 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
25270 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
25280 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
25290 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
252a0 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
252b0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
252c0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
252d0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
252e0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
252f0 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
25300 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
25310 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
25320 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
25330 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
25340 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
25350 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
25360 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
25370 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
25380 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
25390 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
253a0 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
253b0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
253c0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
253d0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
253e0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
253f0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
25400 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
25410 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
25420 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
25430 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
25440 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
25450 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
25460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25470 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
25480 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
25490 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
254a0 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
254b0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
254c0 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c  ct behavior woul
254d0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
254e0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
254f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
25500 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
25510 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
25520 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
25530 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
25540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
25550 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
25560 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
25570 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
25580 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
25590 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
255a0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
255b0 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
255c0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
255d0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
255e0 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
255f0 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
25600 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
25610 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
25620 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
25630 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
25640 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
25650 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
25660 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
25670 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
25680 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
25690 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
256a0 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
256b0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
256c0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
256d0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
256e0 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
256f0 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
25700 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
25710 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
25720 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
25730 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
25740 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
25750 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25760 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
25770 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
25780 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25790 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
257a0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
257b0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
257c0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
257d0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
257e0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
257f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
25800 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
25810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
25820 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
25830 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
25840 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
25850 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
25860 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
25870 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
25880 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
25890 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
258a0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
258b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
258c0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
258d0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
258e0 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
258f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f  ransaction..** O
25900 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nce this functio
25910 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
25920 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  d, the transacti
25930 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62  on must either b
25940 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e.** rolled back
25950 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49   or committed. I
25960 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
25970 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
25980 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20  ion and.** then 
25990 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67  continue writing
259a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
259b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
259c0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
259d0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
259e0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
259f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25a00 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
25a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25a20 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
25a30 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
25a40 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
25a50 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
25a60 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  /* At one poi
25a70 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  nt the code here
25a80 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72   called assertTr
25a90 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25aa0 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72  () to.  ** ensur
25ab0 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  e that all pages
25ac0 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64   being truncated
25ad0 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70   away by this op
25ae0 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a  eration are,.  *
25af0 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * if one or more
25b00 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
25b10 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e  open, present in
25b20 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
25b30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20    ** journal so 
25b40 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
25b50 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65   restored if the
25b60 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f   savepoint is ro
25b70 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
25b80 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  This is no longe
25b90 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  r necessary as t
25ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25bb0 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61  now only.  ** ca
25bc0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
25bd0 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
25be0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61  ransaction. So a
25bf0 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a  lthough the .  *
25c00 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d  * Pager object m
25c10 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70  ay still have op
25c20 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50  en savepoints (P
25c30 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21  ager.nSavepoint!
25c40 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20  =0), .  ** they 
25c50 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
25c60 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73   back. So the as
25c70 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25c80 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20  traint() call.  
25c90 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
25ca0 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a  correct. */.}...
25cb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25cc0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
25cd0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
25ce0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
25cf0 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
25d00 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
25d10 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
25d20 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
25d30 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
25d40 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
25d50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
25d60 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
25d70 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
25d80 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
25d90 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
25da0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
25db0 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
25dc0 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
25dd0 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
25de0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
25df0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
25e00 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
25e10 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
25e20 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
25e30 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
25e40 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
25e50 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
25e60 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
25e70 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
25e80 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
25e90 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
25ea0 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
25eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
25ec0 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
25ed0 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
25ee0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
25ef0 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
25f00 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
25f10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25f20 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
25f30 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
25f40 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
25f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
25f60 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
25f70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
25f80 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
25f90 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
25fa0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
25fb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
25fd0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
25fe0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
25ff0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
26000 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
26010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26020 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
26030 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d  ce to a memory m
26040 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63  apped page objec
26050 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  t for page numbe
26060 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20  r pgno. .** The 
26070 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
26080 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  use the pointer 
26090 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20  pData, obtained 
260a0 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a  from xFetch()..*
260b0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
260c0 20 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20   set *ppPage to 
260d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
260e0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a   page reference.
260f0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ** and return SQ
26100 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
26110 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  se, return an SQ
26120 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
26130 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61  and set.** *ppPa
26140 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  ge to zero..**.*
26150 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  * Page reference
26160 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  s obtained by ca
26170 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
26180 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65  ion should be re
26190 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c  leased.** by cal
261a0 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73  ling pagerReleas
261b0 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
261c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
261d0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20  cquireMapPage(. 
261e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
26210 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
26240 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mber */.  void *
26250 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
26260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
26270 74 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72  tch()'d data for
26280 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
26290 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20  PgHdr **ppPage  
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64  /* OUT: Acquired
262c0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   page object */.
262d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
26300 61 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65  apped page to re
26310 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  turn */..  if( p
26320 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26330 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
26340 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
26350 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
26360 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
26370 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
26380 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
26390 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d  Dirty = 0;.    m
263a0 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
263b0 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
263c0 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
263d0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
263e0 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33  (PgHdr *)sqlite3
263f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
26400 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65  f(PgHdr) + pPage
26410 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
26420 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
26430 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
26440 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
26450 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
26460 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
26470 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72   pData);.      r
26480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
26490 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  EM;.    }.    p-
264a0 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20  >pExtra = (void 
264b0 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e  *)&p[1];.    p->
264c0 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d  flags = PGHDR_MM
264d0 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  AP;.    p->nRef 
264e0 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67  = 1;.    p->pPag
264f0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d  er = pPager;.  }
26500 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
26510 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26  Extra==(void *)&
26520 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  p[1] );.  assert
26530 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b  ( p->pPage==0 );
26540 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c  .  assert( p->fl
26550 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20  ags==PGHDR_MMAP 
26560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26570 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
26580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
26590 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e  Ref==1 );..  p->
265a0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
265b0 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
265c0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
265d0 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e  Out++;..  return
265e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
265f0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
26600 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
26610 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
26620 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
26630 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
26640 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
26650 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
26660 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
26670 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
26680 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
26690 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
266a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
266b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
266c0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
266d0 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
266e0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
266f0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26700 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
26710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26720 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
26730 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
26740 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
26750 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
26760 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
26770 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26780 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
26790 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
267a0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
267b0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
267c0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
267d0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
267e0 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
267f0 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
26800 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
26810 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
26820 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
26830 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26840 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
26850 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
26860 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
26870 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
26880 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
26890 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
268a0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
268b0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
268c0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
268d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
268e0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
268f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26900 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
26910 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
26920 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
26930 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
26940 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
26950 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
26960 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
26970 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
26980 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
26990 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
269a0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
269b0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
269c0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
269d0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
269e0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
269f0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
26a00 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
26a10 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
26a20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
26a30 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
26a40 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
26a50 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
26a60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
26a70 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
26a80 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
26a90 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
26aa0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
26ab0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
26ac0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
26ad0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
26ae0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26af0 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
26b00 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
26b10 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
26b20 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61  >pTmpSpace;..  a
26b30 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
26b40 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
26b50 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
26b60 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
26b70 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
26b80 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
26b90 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d  ();.  pagerFreeM
26ba0 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a  apHdrs(pPager);.
26bb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
26bc0 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
26bd0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
26be0 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
26bf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
26c00 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
26c10 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
26c20 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
26c30 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
26c40 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29  >pageSize, pTmp)
26c50 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
26c60 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
26c70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
26c80 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
26c90 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
26ca0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
26cb0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
26cc0 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
26cd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26ce0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
26cf0 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
26d00 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
26d10 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
26d20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
26d30 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
26d40 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
26d50 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
26d60 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
26d70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
26d80 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
26d90 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
26da0 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
26db0 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
26dc0 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
26dd0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
26de0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
26df0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
26e00 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
26e10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
26e20 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
26e30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
26e40 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
26e50 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
26e60 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
26e70 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
26e80 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
26e90 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
26ea0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
26eb0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
26ec0 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
26ed0 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
26ee0 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
26ef0 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
26f00 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
26f10 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
26f20 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
26f30 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
26f40 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
26f50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
26f60 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
26f70 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
26f80 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
26f90 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
26fa0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
26fb0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
26fc0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
26fd0 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
26fe0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
26ff0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
27000 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
27010 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
27020 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
27030 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
27040 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
27050 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
27060 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
27070 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
27080 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
27090 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
270a0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
270b0 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
270c0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
270d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
270e0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
270f0 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
27100 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
27110 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
27120 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
27130 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
27140 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
27150 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
27160 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
27180 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27190 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
271a0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
271b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
271c0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
271d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
271e0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
271f0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
27200 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
27210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
27220 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
27230 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
27240 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
27250 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
27260 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
27270 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
27280 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
27290 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
272a0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
272b0 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
272c0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
272d0 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
272e0 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
272f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
27300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
27310 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
27320 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
27330 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
27340 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
27350 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
27360 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
27370 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
27380 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
27390 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
273a0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
273b0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
273c0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
273d0 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
273e0 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
273f0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
27400 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
27410 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
27420 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
27430 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
27440 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
27450 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
27460 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
27470 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  cs of the file-s
27480 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
27490 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
274a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
274b0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
274c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
274d0 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
274e0 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
274f0 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
27500 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
27510 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
27520 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
27530 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
27540 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
27550 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
27560 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
27570 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
27580 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
27590 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
275a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
275b0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
275c0 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
275d0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
275e0 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
275f0 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
27600 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
27610 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
27620 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
27630 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
27640 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
27650 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
27660 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
27670 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
27680 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
27690 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
276a0 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
276b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
276c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
276d0 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
276e0 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
276f0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
27700 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
27710 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
27720 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
27730 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
27740 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
27750 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
27760 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
27770 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
27780 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
27790 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
277a0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
277b0 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
277c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
277d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
277e0 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
277f0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
27800 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
27810 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
27820 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
27830 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
27840 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
27850 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
27860 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
27870 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
27880 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
27890 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
278a0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
278b0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
278c0 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20   int newHdr){.  
278d0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
27900 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
27910 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
27920 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
27930 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
27940 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
27950 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
27960 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
27970 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
27980 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
27990 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
279a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
279b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
279c0 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
279d0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
279e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
279f0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
27a00 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
27a10 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
27a20 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
27a30 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
27a40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27a50 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
27a60 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
27a70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
27a80 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RY ){.      cons
27a90 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
27aa0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
27ab0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
27ac0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
27ad0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
27ae0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
27af0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
27b00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
27b10 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
27b20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
27b30 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
27b40 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
27b50 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
27b60 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
27b70 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
27b80 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
27b90 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
27ba0 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
27bb0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
27bc0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
27bd0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
27be0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
27bf0 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
27c00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
27c10 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
27c20 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
27c30 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
27c40 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
27c50 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
27c60 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
27c70 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
27c80 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
27c90 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
27ca0 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
27cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
27cc0 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
27cd0 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
27ce0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
27cf0 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
27d00 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
27d10 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
27d20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
27d30 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
27d40 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
27d50 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
27d60 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
27d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
27d80 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
27d90 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
27da0 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
27db0 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
27dc0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
27dd0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
27de0 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
27df0 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
27e00 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
27e10 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
27e20 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
27e30 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
27e40 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
27e50 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
27e60 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
27e70 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
27e80 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
27e90 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
27ea0 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
27eb0 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
27ec0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
27ed0 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
27ee0 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
27ef0 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
27f00 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
27f10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
27f20 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
27f30 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
27f40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
27f50 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
27f60 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
27f70 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
27f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
27f90 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
27fa0 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
27fb0 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
27fc0 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
27fd0 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
27fe0 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
27ff0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
28000 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
28010 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
28020 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
28030 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
28040 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
28050 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
28060 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
28070 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
28080 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28090 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
280a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
280b0 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
280c0 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
280d0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
280e0 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
280f0 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
28100 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
28110 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
28120 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
28130 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
28140 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
28150 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
28160 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
28170 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
28180 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
28190 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
281a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
281b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
281c0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
281d0 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
281e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
281f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28200 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
28210 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
28220 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
28230 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
28240 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
28250 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28260 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
28270 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
28280 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
28290 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
282a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
282b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
282c0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
282d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
282e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
282f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
28300 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
28310 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
28320 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
28330 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
28340 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
28350 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
28360 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
28370 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
28380 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
28390 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
283a0 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
283b0 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
283c0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
283d0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
283e0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
283f0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
28400 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
28410 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
28420 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
28430 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
28440 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
28450 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
28460 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
28470 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
28480 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
28490 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
284a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
284b0 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
284c0 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
284d0 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
284e0 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
284f0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
28500 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
28510 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
28520 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
28530 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
28540 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
28550 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
28560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28570 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
28580 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
28590 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
285a0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
285b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
285c0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
285d0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
285e0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
285f0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28600 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
28610 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
28620 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
28630 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
28640 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
28650 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
28660 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28670 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28690 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
286a0 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
286b0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
286c0 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
286d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
286e0 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
286f0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
28700 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
28710 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
28720 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
28730 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
28740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28750 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28760 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28770 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28780 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
28790 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
287a0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
287b0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
287c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
287d0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
287e0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
287f0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
28800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28810 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
28820 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
28830 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
28840 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c   (pPager->syncFl
28850 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
28860 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
28870 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
28880 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28890 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
288a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
288b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
288c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
288d0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
288e0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
288f0 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
28900 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
28910 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
28920 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
28930 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
28940 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
28950 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
28960 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28980 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
289a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
289b0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
289c0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
289d0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
289e0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
289f0 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
28a00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
28a10 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
28a20 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
28a30 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
28a40 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
28a50 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
28a60 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
28a70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
28a80 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
28a90 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
28aa0 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
28ab0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
28ac0 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
28ad0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
28ae0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
28af0 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
28b00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28b10 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
28b20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
28b30 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
28b40 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
28b50 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
28b60 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
28b70 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
28b80 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
28b90 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
28ba0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
28bb0 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
28bc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28bd0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
28be0 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
28bf0 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
28c00 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
28c10 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
28c20 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
28c30 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
28c40 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
28c50 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
28c60 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
28c70 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
28c80 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
28c90 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
28ca0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28cb0 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
28cc0 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
28cd0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
28ce0 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
28cf0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
28d00 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
28d10 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
28d20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
28d30 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
28d40 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
28d50 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
28d60 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
28d70 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
28d80 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
28d90 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
28da0 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
28db0 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
28dc0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
28dd0 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
28de0 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
28df0 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
28e00 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
28e10 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
28e20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
28e30 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
28e40 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
28e50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28e60 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
28e70 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
28e80 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
28e90 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
28ea0 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
28eb0 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
28ec0 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
28ed0 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
28ee0 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
28ef0 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
28f00 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
28f10 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
28f20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
28f30 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
28f40 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
28f50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f60 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
28f70 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
28f80 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
28f90 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
28fa0 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
28fb0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
28fc0 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
28fd0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
28fe0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
28ff0 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
29000 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
29010 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29020 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
29030 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
29040 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
29050 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
29060 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
29070 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
29080 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29090 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
290a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
290b0 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
290c0 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
290d0 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
290e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
290f0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
29100 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
29110 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
29120 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29130 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
29140 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29150 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
29160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29170 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
29180 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
29190 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
291a0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
291b0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
291c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
291d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
291e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
291f0 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
29200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
29210 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
29220 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
29230 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
29240 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
29250 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
29260 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
29270 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
29280 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
29290 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
292a0 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
292b0 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
292c0 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
292d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
292e0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
292f0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
29300 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
29310 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
29320 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
29330 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
29340 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
29350 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
29360 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
29370 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
29380 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
29390 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
293a0 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
293b0 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
293c0 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
293d0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
293e0 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
293f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
29400 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
29410 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
29420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29430 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65  _OK .   && pPage
29440 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50  r->dbHintSize<pP
29450 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20  ager->dbSize.   
29460 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74  && (pList->pDirt
29470 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  y || pList->pgno
29480 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
29490 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ize).  ){.    sq
294a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
294b0 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
294c0 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
294d0 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
294e0 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
294f0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
29500 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
29510 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
29520 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
29530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
29540 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
29550 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
29560 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
29570 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
29580 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
29590 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
295a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
295b0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
295c0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
295d0 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
295e0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
295f0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
29600 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
29610 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
29620 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
29630 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
29640 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
29650 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
29660 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
29670 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
29680 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
29690 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
296a0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
296b0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
296c0 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
296d0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
296e0 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
296f0 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
29700 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
29710 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
29720 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
29730 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
29740 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
29750 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
29760 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
29770 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
29780 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
29790 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
297a0 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
297b0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
297c0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
297d0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
29800 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
29810 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
29820 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
29830 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
29840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
29850 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
29860 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
29870 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
29880 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
29890 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
298a0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
298b0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
298c0 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
298d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
298e0 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
298f0 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
29900 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
29910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29920 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
29930 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
29940 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
29950 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
29960 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
29970 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
29980 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
29990 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
299a0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
299b0 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
299c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
299d0 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
299e0 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
299f0 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
29a00 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
29a10 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
29a20 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
29a30 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
29a40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
29a50 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
29a60 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
29a70 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
29a80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
29a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29aa0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
29ab0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
29ac0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
29ad0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
29ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29af0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
29b00 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b  GER_STAT_WRITE]+
29b10 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  +;..      /* Upd
29b20 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
29b30 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
29b40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
29b50 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
29b60 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
29b70 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
29b80 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
29b90 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
29ba0 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
29bb0 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
29bc0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
29bd0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
29be0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
29bf0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
29c00 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
29c10 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
29c20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
29c30 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
29c40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
29c50 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
29c60 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
29c70 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c  _count);.    }el
29c80 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
29c90 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
29ca0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29cb0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29cc0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
29cd0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
29ce0 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ash(pList);.    
29cf0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
29d00 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
29d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29d20 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
29d30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
29d40 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
29d50 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
29d60 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
29d70 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
29d80 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
29d90 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
29da0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
29db0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
29dc0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
29dd0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
29de0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29df0 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
29e00 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
29e10 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
29e20 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
29e30 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
29e40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
29e50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
29e60 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
29e70 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
29e80 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
29e90 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
29ea0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
29eb0 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
29ec0 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
29ed0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
29ee0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
29ef0 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
29f00 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
29f10 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
29f20 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
29f30 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
29f40 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
29f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
29f70 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
29f80 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
29f90 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
29fa0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
29fb0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
29fc0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
29fd0 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
29fe0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
29ff0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
2a000 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
2a010 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
2a020 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
2a030 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
2a040 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
2a050 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
2a060 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
2a070 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
2a080 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
2a090 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
2a0a0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2a0b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2a0c0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2a0d0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2a0e0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2a0f0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
2a100 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
2a110 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2a120 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2a130 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
2a140 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2a150 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
2a160 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
2a170 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
2a180 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
2a190 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2a1a0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
2a1b0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
2a1c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
2a1d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2a1e0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
2a1f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a200 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2a210 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
2a220 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2a230 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2a240 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
2a250 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
2a260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a270 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2a280 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2a290 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2a2a0 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
2a2b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2a2c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a2d0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2a2e0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2a2f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2a300 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2a310 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2a320 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2a330 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20  (pPg) .         
2a340 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2a350 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2a360 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2a370 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2a380 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2a390 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2a3a0 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2a3b0 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2a3c0 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2a3d0 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2a3e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2a3f0 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2a400 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2a410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a420 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2a430 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2a440 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2a450 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2a460 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2a470 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2a480 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2a490 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2a4a0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2a4b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2a4c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a4d0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
2a4e0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a4f0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2a500 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2a510 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2a520 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2a530 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2a540 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2a550 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2a560 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a580 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a590 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a5a0 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2a5b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a5c0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2a5d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2a5e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a5f0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2a600 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2a610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a620 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2a630 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2a640 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2a650 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2a660 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2a680 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a690 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2a6a0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2a6b0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2a6c0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2a6d0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2a6e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a6f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2a700 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2a710 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2a720 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2a730 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2a740 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2a750 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2a760 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2a770 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2a780 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2a790 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2a7a0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2a7b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2a7c0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2a7d0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2a7e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2a7f0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2a800 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2a810 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2a820 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2a830 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2a840 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2a850 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2a860 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2a870 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2a880 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2a890 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2a8a0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2a8b0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2a8c0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2a8d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2a8e0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2a8f0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2a900 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2a910 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2a920 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2a930 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2a940 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2a950 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2a960 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2a970 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2a980 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2a990 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2a9a0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2a9b0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2a9c0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2a9d0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2a9e0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2a9f0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2aa00 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2aa10 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2aa20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2aa30 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2aa40 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2aa50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2aa60 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2aa70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2aa80 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2aa90 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2aaa0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2aab0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2aac0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2aad0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2aae0 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2aaf0 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2ab00 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2ab10 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2ab20 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2ab30 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2ab40 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2ab50 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2ab60 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2ab70 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2ab80 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2ab90 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2aba0 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2abb0 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2abc0 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2abd0 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2abe0 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2abf0 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2ac00 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2ac10 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2ac20 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2ac30 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2ac40 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2ac50 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2ac60 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2ac70 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2ac80 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2ac90 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2aca0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2acb0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2acc0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2acd0 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2ace0 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2acf0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2ad00 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2ad10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69   implementaton i
2ad20 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2ad30 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2ad40 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2ad50 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2ad60 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20   createFlag==1. 
2ad70 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2ad80 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2ad90 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2ada0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2adb0 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2adc0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2add0 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2ade0 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2adf0 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2ae00 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2ae10 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2ae20 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2ae30 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2ae40 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2ae50 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2ae60 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2ae70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73  SQLITE_OK;.  tes
2ae80 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2ae90 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2aea0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29  LFLAG_ROLLBACK )
2aeb0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2aec0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2aed0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46   & SPILLFLAG_OFF
2aee0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2aef0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2af00 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
2af10 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70  OSYNC );.  if( p
2af20 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2af30 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72  l.   && ((pPager
2af40 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28  ->doNotSpill & (
2af50 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2af60 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  CK|SPILLFLAG_OFF
2af70 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28  ))!=0.      || (
2af80 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2af90 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2afa0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2afb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2afc0 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
2afd0 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2afe0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2aff0 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
2b000 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2b010 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2b020 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69  he log. */.    i
2b030 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2b040 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20  age(pPg) ){ .   
2b050 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2b060 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20  alPage(pPg); .  
2b070 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b090 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2b0a0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2b0b0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2b0c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
2b0d0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2b0e0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
2b0f0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
2b100 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2b110 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
2b120 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
2b130 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2b140 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
2b150 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
2b160 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2b170 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
2b180 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
2b190 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
2b1a0 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
2b1b0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
2b1c0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
2b1d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2b1e0 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
2b1f0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
2b200 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b210 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
2b220 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2b230 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
2b240 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
2b250 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  w will not.    *
2b260 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
2b270 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
2b280 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2b290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
2b2a0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
2b2b0 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
2b2c0 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a   events:.    **.
2b2d0 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a      **   BEGIN;.
2b2e0 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72      **     <jour
2b2f0 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20  nal page X>.    
2b300 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
2b310 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2b320 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
2b330 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68      **       <sh
2b340 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
2b350 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
2b360 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65     **       page
2b370 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
2b380 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42      **     ROLLB
2b390 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a  ACK TO sp;.    *
2b3a0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59  *.    ** If (X>Y
2b3b0 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67  ), then when pag
2b3c0 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c  erStress is call
2b3d0 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e  ed page X will n
2b3e0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ot be written.  
2b3f0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
2b400 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
2b410 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
2b420 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
2b430 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20  e. Then,.    ** 
2b440 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
2b450 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
2b460 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
2b470 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
2b480 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66  ad.    ** data f
2b490 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2b4a0 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
2b4b0 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
2b4c0 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20  page X as it.   
2b4d0 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
2b4e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
2b4f0 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
2b500 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
2b510 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77  INT sp".    ** w
2b520 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  as executed..   
2b530 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2b540 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
2b550 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2b560 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
2b570 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
2b580 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2b590 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20  e now (if it is 
2b5a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72  not already ther
2b5b0 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77  e), so that it w
2b5c0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
2b5d0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
2b5e0 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
2b5f0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
2b600 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a  O sp" is .    **
2b610 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
2b620 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
2b630 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  .        rc==SQL
2b640 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
2b650 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
2b660 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
2b670 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20  esPage(pPg).    
2b680 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2b690 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b6a0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pg);.    }.  .  
2b6b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2b6c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2b6d0 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2b6e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b6f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b710 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2b720 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2b730 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2b740 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2b750 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2b760 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2b770 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2b780 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2b790 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2b7a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2b7b0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2b7c0 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2b7d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b7e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2b7f0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b800 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2b810 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2b820 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2b830 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a  r, rc); .}.../*.
2b840 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2b850 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2b860 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2b870 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2b880 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2b890 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2b8a0 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2b8b0 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2b8c0 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2b8d0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2b8e0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2b8f0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2b900 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2b910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b920 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2b930 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2b940 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2b950 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2b960 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2b970 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2b980 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2b990 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2b9a0 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2b9b0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2b9c0 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2b9d0 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2b9e0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2b9f0 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2ba00 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2ba10 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2ba20 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2ba30 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2ba40 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2ba50 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2ba60 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2ba70 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2ba80 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2ba90 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2baa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2bab0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2bac0 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2bad0 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2bae0 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2baf0 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2bb00 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2bb10 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2bb20 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2bb30 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2bb40 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2bb50 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2bb60 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2bb70 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2bb80 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2bb90 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2bba0 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2bbb0 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2bbc0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2bbd0 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2bbe0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2bbf0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2bc00 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2bc10 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2bc20 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2bc30 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2bc40 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2bc50 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2bc60 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2bc70 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2bc80 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2bc90 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2bca0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2bcb0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2bcc0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2bcd0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2bce0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2bcf0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2bd00 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2bd10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2bd20 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2bd30 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2bd40 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2bd50 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2bd60 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2bd70 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2bd80 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2bd90 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2bda0 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2bdb0 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2bdc0 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2bdd0 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2bde0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2bdf0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2be00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2be10 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2be20 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2be30 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2be40 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2be50 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2be60 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2be70 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2be80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2be90 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2bea0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2beb0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2bec0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2bee0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2bef0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2bf00 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2bf10 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2bf20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2bf30 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2bf40 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2bf50 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2bf60 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2bf70 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2bf80 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2bf90 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2bfa0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2bfb0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2bfc0 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2bfd0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2bfe0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2bff0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2c000 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2c010 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2c020 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2c030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c040 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c050 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2c060 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2c070 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2c080 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2c090 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2c0a0 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2c0b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2c0c0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c0d0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2c0e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2c0f0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2c100 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c110 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2c120 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2c130 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2c140 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c150 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2c160 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2c170 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2c180 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2c190 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2c1a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c1b0 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2c1c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c1d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2c1e0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2c1f0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2c200 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2c210 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2c220 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2c230 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c240 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2c250 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c260 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c270 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c280 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2c290 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2c2a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2c2b0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2c2c0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2c2d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c2e0 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2c2f0 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2c300 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2c310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2c320 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c330 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2c340 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2c350 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2c360 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2c370 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2c380 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c390 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2c3a0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2c3b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2c3c0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2c3d0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2c3e0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2c3f0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2c400 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2c410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2c420 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2c430 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2c440 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2c450 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2c460 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2c470 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2c480 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2c490 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2c4a0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2c4b0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2c4c0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2c4d0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c4e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2c4f0 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2c500 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2c510 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2c520 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2c530 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c540 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2c550 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2c560 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c570 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c580 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c590 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2c5a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c5b0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c5c0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2c5d0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2c5e0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2c5f0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2c600 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2c610 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2c620 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2c630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2c640 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2c650 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2c660 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2c670 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2c680 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2c690 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2c6a0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2c6b0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2c6c0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2c6d0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2c6e0 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2c6f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c700 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2c710 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2c720 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2c730 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2c740 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2c750 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2c760 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2c770 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2c780 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2c790 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2c7a0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2c7b0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2c7c0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2c7d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2c7e0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2c7f0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2c800 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2c810 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2c820 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2c830 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2c840 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2c850 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2c860 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2c870 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2c880 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2c890 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2c8a0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2c8b0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2c8c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c8d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2c8e0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2c8f0 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2c900 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2c910 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2c920 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2c930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2c940 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2c950 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2c960 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2c970 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2c980 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2c990 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2c9a0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2c9b0 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2c9c0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2c9d0 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2c9e0 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2c9f0 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ca00 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2ca10 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2ca20 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ca30 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2ca40 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2ca50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2ca60 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2ca70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ca80 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2ca90 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2caa0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2cab0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2cac0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2cad0 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2cae0 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2caf0 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2cb00 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2cb10 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2cb20 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2cb30 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2cb40 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2cb50 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2cb60 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2cb70 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2cb80 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2cb90 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2cba0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2cbb0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2cbc0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2cbd0 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2cbe0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cbf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2cc00 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2cc10 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2cc20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cc30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2cc40 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2cc50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cc60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2cc70 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2cc80 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2cc90 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2cca0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2ccb0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2ccc0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2ccd0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2cce0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2ccf0 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2cd00 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2cd10 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2cd20 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2cd30 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd50 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2cd60 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2cd70 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd90 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2cda0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2cdb0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2cdc0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2cdd0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2cde0 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2cdf0 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2ce00 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2ce10 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2ce20 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2ce30 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2ce40 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2ce50 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2ce60 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2ce70 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2ce80 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2ce90 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2cea0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2ceb0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2cec0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2ced0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2cee0 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2cef0 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2cf00 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2cf10 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2cf20 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2cf30 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2cf40 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2cf50 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2cf60 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2cf70 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2cf80 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2cf90 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2cfa0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2cfb0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2cfc0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2cfd0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2cfe0 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2cff0 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d000 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d010 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d020 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d030 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d040 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d050 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d070 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d080 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d0a0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d0b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d0c0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d0d0 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d0e0 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d0f0 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d100 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d110 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d120 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d130 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d140 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2d160 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2d170 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2d180 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2d190 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2d1a0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2d1b0 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2d1c0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d1d0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d1e0 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2d1f0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2d200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d210 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d220 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2d230 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2d240 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d250 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d260 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2d270 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2d280 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2d290 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d2a0 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2d2b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d2c0 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2d2d0 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2d2e0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2d2f0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2d300 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2d310 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2d320 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2d330 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2d340 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2d350 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2d360 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2d370 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2d380 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2d390 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d3a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d3b0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d3c0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2d3d0 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2d3e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2d3f0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2d400 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2d410 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2d420 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2d430 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d440 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d450 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d460 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2d470 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2d480 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d490 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d4a0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d4b0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2d4c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2d4d0 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2d4e0 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2d4f0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d500 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2d510 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2d520 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d530 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2d540 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2d550 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2d560 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2d570 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d580 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d590 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d5a0 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2d5b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d5c0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d5d0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2d5e0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2d5f0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2d600 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2d610 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2d620 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2d630 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2d640 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2d650 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d670 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2d680 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2d690 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2d6a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2d6b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2d6c0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2d6d0 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2d6e0 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2d6f0 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2d700 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2d710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2d720 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2d730 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2d740 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2d750 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2d760 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2d770 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2d780 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2d790 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2d7a0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2d7b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2d7c0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2d7d0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2d7e0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2d7f0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2d800 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2d810 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2d820 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2d830 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2d840 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2d850 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2d860 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2d870 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2d880 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2d890 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2d8a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2d8b0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2d8c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2d8d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
2d8e0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2d8f0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2d900 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2d910 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2d920 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2d930 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2d940 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2d950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2d960 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2d970 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2d980 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2d990 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2d9a0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2d9b0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2d9c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d9d0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d9e0 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2d9f0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2da00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2da10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2da20 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2da30 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2da40 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2da50 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2da60 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2da70 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
2da80 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
2da90 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2daa0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2dab0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2dac0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2dad0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2dae0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2daf0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2db00 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2db10 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2db20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
2db30 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2db40 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2db50 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2db60 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2db70 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2db80 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2db90 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2dba0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2dbb0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2dbc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2dbd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2dbe0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2dbf0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2dc00 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2dc10 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2dc20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2dc30 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2dc40 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2dc50 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2dc60 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2dc70 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2dc80 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2dc90 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2dca0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2dcb0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2dcc0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2dcd0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2dce0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2dcf0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2dd00 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2dd10 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2dd20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2dd30 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2dd40 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2dd50 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2dd60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2dd70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2dd80 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
2dd90 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2dda0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2ddb0 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
2ddc0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2ddd0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2dde0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2ddf0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2de00 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2de10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2de20 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2de30 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2de40 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2de50 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2de60 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2de70 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2de80 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2de90 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2dea0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2deb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dec0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ded0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2dee0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2def0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2df00 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2df10 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2df20 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2df30 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2df40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2df50 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
2df60 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
2df70 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
2df80 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
2df90 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2dfa0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2dfb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dfc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2dfd0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2dfe0 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
2dff0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2e000 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2e010 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2e020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e030 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2e040 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2e050 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ject. */.  asser
2e060 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2e070 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55  ;.  nExtra = ROU
2e080 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ND8(nExtra);.  s
2e090 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2e0a0 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2e0b0 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2e0e0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2e0f0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2e100 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
2e110 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2e120 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2e130 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2e140 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e150 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2e160 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2e170 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2e180 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2e190 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2e1a0 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2e1b0 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2e1c0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2e1d0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e1e0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2e1f0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e200 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2e210 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2e220 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2e230 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2e240 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e250 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2e260 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2e270 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2e280 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2e290 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2e2a0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2e2b0 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2e2c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2e2d0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2e2e0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2e2f0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2e300 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2e310 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2e320 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e330 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2e340 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2e350 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2e360 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e370 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2e380 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2e390 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2e3a0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2e3b0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2e3c0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2e3d0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2e3e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e3f0 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2e400 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2e410 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2e420 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e430 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2e440 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2e450 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2e460 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2e470 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2e480 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2e490 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2e4a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2e4b0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2e4c0 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
2e4d0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2e4e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e4f0 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  fullSync==0 );. 
2e500 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e510 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2e520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e530 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2e540 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2e550 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2e560 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2e570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2e580 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2e590 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2e5a0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
2e5b0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2e5c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
2e5d0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2e5e0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c  TE_SYNC_NORMAL |
2e5f0 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
2e600 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67  CTIONS;.    pPag
2e610 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e620 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e630 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
2e640 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2e650 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e660 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2e670 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2e680 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2e690 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2e6a0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2e6b0 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2e6c0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2e6d0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2e6e0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2e6f0 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2e700 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2e710 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2e720 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2e730 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2e740 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2e750 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2e760 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2e770 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2e780 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2e790 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2e7a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2e7b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2e7c0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2e7d0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2e7e0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2e7f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2e800 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2e810 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2e820 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2e830 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2e840 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2e850 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2e860 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a  aHash)); */.  /*
2e870 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
2e880 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2e890 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69  _MMAP_SIZE // wi
2e8a0 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72  ll be set by btr
2e8b0 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  ee.c */..  *ppPa
2e8c0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2e8d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e8e0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
2e8f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2e900 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2e910 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2e920 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2e930 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2e940 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2e950 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2e960 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2e970 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2e980 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2e990 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2e9a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2e9b0 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2e9c0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2e9d0 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2e9e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2e9f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2ea00 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2ea10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2ea20 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2ea30 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2ea40 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2ea50 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2ea60 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2ea70 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2ea80 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2ea90 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2eaa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2eab0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2eac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2ead0 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2eae0 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2eaf0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2eb00 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2eb10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2eb20 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2eb30 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2eb40 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2eb50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2eb60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2eb70 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2eb80 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2eb90 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2eba0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2ebb0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2ebc0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2ebd0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2ebe0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2ebf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2ec00 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2ec10 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2ec20 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2ec30 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2ec40 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2ec50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2ec60 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2ec70 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2ec80 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2ec90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2eca0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2ecb0 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2ecc0 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2ecd0 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2ece0 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2ecf0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2ed00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ed10 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2ed20 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2ed30 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2ed40 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2ed50 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2ed60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2ed70 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2ed80 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2ed90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2eda0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2edb0 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2edc0 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2edd0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2ede0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2edf0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2ee00 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2ee10 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2ee20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2ee30 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2ee40 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2ee50 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2ee60 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2ee70 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2ee80 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2ee90 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2eea0 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2eeb0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2eec0 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2eed0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2eee0 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2eef0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2ef00 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2ef10 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2ef20 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2ef30 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2ef40 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2ef50 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2ef60 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2ef70 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2ef80 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2ef90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2efa0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2efb0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2efc0 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2efd0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2efe0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2eff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f000 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2f010 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2f020 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f030 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2f040 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2f050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2f060 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2f080 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2f090 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2f0a0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2f0b0 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2f0c0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2f0d0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2f0e0 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2f0f0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2f100 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2f110 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2f120 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2f130 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2f140 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f150 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2f160 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2f170 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2f180 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2f190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f1a0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2f1b0 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f1d0 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2f1e0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2f1f0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2f200 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2f210 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2f220 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2f230 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2f240 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2f250 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2f260 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2f270 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2f280 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f290 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2f2a0 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2f2b0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2f2c0 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2f2d0 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2f2e0 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2f2f0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2f300 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2f310 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2f320 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2f330 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2f340 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2f350 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2f360 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2f370 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2f380 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2f390 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2f3a0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2f3b0 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2f3c0 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2f3d0 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2f3e0 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2f3f0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2f400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f410 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2f420 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2f430 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2f440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f450 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2f460 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f480 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f490 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2f4a0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43  e */..      /* C
2f4b0 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66  heck the size of
2f4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f4d0 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73  le. If it consis
2f4e0 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20  ts of 0 pages,. 
2f4f0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c       ** then del
2f500 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2f510 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65  file. See the he
2f520 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f  ader comment abo
2f530 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ve for .      **
2f540 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68   the reasoning h
2f550 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ere.  Delete the
2f560 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
2f570 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20  l file under.   
2f580 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44     ** a RESERVED
2f590 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72   lock to avoid r
2f5a0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ace conditions a
2f5b0 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c  nd to avoid viol
2f5c0 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b  ating.      ** [
2f5d0 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a  H33020]..      *
2f5e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2f5f0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2f600 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2f610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f630 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
2f640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f650 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2f660 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2f670 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2f680 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2f690 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2f6a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f6b0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2f6c0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f6d0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2f6e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2f6f0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f700 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2f710 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2f720 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2f730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f740 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2f750 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2f760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f770 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2f780 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2f790 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2f7a0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2f7b0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2f7c0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2f7d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2f7e0 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2f7f0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2f800 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2f810 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2f820 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2f830 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2f840 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2f850 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2f860 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2f870 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2f880 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2f890 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2f8a0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2f8b0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2f8c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2f8d0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2f8e0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2f8f0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2f900 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2f910 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2f920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2f930 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2f940 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f950 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2f960 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2f970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f980 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f9a0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2f9b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2f9c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2f9d0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2f9e0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2f9f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2fa00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fa10 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2fa20 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2fa30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2fa40 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2fa50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2fa60 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2fa80 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2fa90 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2faa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fab0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2fac0 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2fad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2fae0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2faf0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2fb00 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2fb10 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2fb20 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2fb30 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2fb40 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2fb50 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
2fb60 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
2fb70 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
2fb80 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
2fb90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2fba0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2fbb0 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
2fbc0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
2fbd0 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
2fbe0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
2fbf0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
2fc00 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
2fc10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2fc20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
2fc30 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
2fc40 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
2fc50 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
2fc60 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
2fc70 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
2fc80 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
2fc90 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
2fca0 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
2fcb0 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
2fcc0 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
2fcd0 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
2fce0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
2fcf0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
2fd00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
2fd10 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
2fd20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
2fd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2fd40 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2fd50 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
2fd60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2fd70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2fd80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2fd90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2fda0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fdb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2fdc0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2fdd0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
2fde0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2fdf0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
2fe00 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
2fe10 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2fe20 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
2fe30 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2fe40 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2fe50 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
2fe60 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
2fe70 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
2fe80 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
2fe90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2fea0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2feb0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2fec0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
2fed0 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
2fee0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
2fef0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2ff00 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
2ff10 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
2ff20 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
2ff30 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2ff40 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2ff50 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2ff60 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2ff70 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2ff80 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2ff90 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2ffa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2ffb0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2ffc0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2ffd0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2ffe0 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2fff0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
30000 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
30010 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
30020 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
30030 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
30040 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
30050 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
30060 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
30070 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
30080 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
30090 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
300a0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
300b0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
300c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
300d0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
300e0 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
300f0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
30100 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
30110 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
30120 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
30130 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
30140 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
30150 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
30160 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
30170 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
30180 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
30190 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
301a0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
301b0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
301c0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
301d0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
301e0 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
301f0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
30200 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30210 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
30220 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
30230 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
30240 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
30250 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
30260 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
30270 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
30280 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30290 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
302a0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
302b0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
302c0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
302d0 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
302e0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
302f0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
30300 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
30310 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
30320 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
30330 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
30340 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
30350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30370 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30380 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
30390 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
303a0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
303b0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
303c0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
303d0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
303e0 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
303f0 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
30400 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
30410 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
30420 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
30430 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
30440 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
30450 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
30460 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
30470 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
30480 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
30490 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
304a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
304b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
304c0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
304d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
304e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
304f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30500 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
30510 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
30520 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
30530 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
30540 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
30550 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
30560 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
30570 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
30580 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
30590 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
305a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
305b0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
305c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
305d0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
305e0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
305f0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
30600 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20   !MEMDB );..    
30610 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
30620 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
30630 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
30640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
30660 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
30670 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
30680 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
30690 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
306a0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
306b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
306c0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
306d0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
306e0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
306f0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
30700 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
30710 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
30720 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
30730 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
30740 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
30750 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
30760 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
30770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
30780 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
30790 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
307a0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
307b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
307c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
307d0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
307e0 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
307f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
30800 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
30810 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
30820 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
30830 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
30840 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
30850 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
30860 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
30870 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
30880 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
30890 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
308a0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
308b0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
308c0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
308d0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
308e0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
308f0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
30900 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
30910 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
30920 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
30930 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
30940 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
30950 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
30960 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
30970 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
30980 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
30990 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
309a0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
309b0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
309c0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
309d0 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
309e0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
309f0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
30a00 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
30a10 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
30a20 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
30a30 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
30a40 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
30a50 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
30a60 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
30a70 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
30a80 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
30a90 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
30aa0 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
30ab0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
30ac0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
30ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30ae0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30af0 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
30b00 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  er is in locking
30b10 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
30b20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69  mode, the lock i
30b30 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67  s.      ** downg
30b40 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f  raded to SHARED_
30b50 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73  LOCK before this
30b60 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
30b70 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
30b80 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
30b90 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
30ba0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
30bb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
30bd0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30be0 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49    }. .      /* I
30bf0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
30c00 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65  ady open and the
30c10 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20   file exists on 
30c20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a  disk, open the .
30c30 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
30c40 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
30c50 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63  access. Write ac
30c60 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64  cess is required
30c70 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20   because .      
30c80 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ** in exclusive-
30c90 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
30ca0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30cb0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
30cc0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  n .      ** and 
30cd0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
30ce0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
30cf0 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20  later on. Also, 
30d00 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20  write-access .  
30d10 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c      ** is usuall
30d20 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  y required to fi
30d30 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d40 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  al in journal_mo
30d50 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20  de=persist .    
30d60 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61    ** mode (and a
30d70 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f  lso for journal_
30d80 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e  mode=truncate on
30d90 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a   some systems)..
30da0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30db0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
30dc0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
30dd0 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e   it usually mean
30de0 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20  s that some .   
30df0 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
30e00 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
30e10 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
30e20 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
30e30 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
30e40 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
30e50 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
30e60 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
30e70 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  , it .      ** m
30e80 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
30e90 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
30ea0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
30eb0 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  en this.      **
30ec0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
30ed0 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
30ee0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
30ef0 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
30f00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
30f10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
30f20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
30f30 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
30f40 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
30f50 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e  pVfs;.        in
30f60 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20  t bExists;      
30f70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30f80 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
30f90 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
30fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30fb0 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
30fc0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
30fd0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
30fe0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
30ff0 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20  , &bExists);.   
31000 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31010 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74  ITE_OK && bExist
31020 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
31030 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
31040 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
31050 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
31060 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
31070 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
31080 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31090 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
310a0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
310b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
310c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
310d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
310e0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
310f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
31100 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
31110 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
31120 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
31130 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31140 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
31150 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
31160 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
31170 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31180 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
31190 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
311a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
311b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
311c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
311d0 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
311e0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
311f0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
31200 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
31210 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
31220 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
31230 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
31240 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
31250 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
31260 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
31270 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
31280 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
31290 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
312a0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
312b0 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
312c0 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a    Sync the hot j
312d0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
312e0 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69  aying.      ** i
312f0 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65  t back since the
31300 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
31310 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74  ashed and left t
31320 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20  he hot journal. 
31330 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
31340 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74   did not sync it
31350 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75   and we are requ
31360 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73  ired to always s
31370 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ync.      ** the
31380 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
31390 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e  playing it back.
313a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
313b0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
313c0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
313d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
313e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
313f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
31400 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
31410 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
31420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31440 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
31450 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
31460 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
31470 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
31480 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EN;.        }.  
31490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
314a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
314b0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
314c0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
314d0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
314e0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  K);.      }..   
314f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31510 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
31520 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72  s taken if an er
31530 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
31540 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a   trying to open.
31550 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f          ** or ro
31560 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ll back a hot-jo
31570 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64  urnal while hold
31580 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
31590 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
315a0 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     ** pager_unlo
315b0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
315c0 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  l be called befo
315d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20  re returning to 
315e0 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a  unlock.        *
315f0 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  * the file. If t
31600 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70  he unlock attemp
31610 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61  t fails, then Pa
31620 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ger.eLock must b
31630 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  e.        ** set
31640 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
31650 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e   (see the commen
31660 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
31670 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20  ine for .       
31680 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   ** UNKNOWN_LOCK
31690 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78   above for an ex
316a0 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20  planation). .   
316b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
316c0 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67  ** In order to g
316d0 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  et pager_unlock(
316e0 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65  ) to do this, se
316f0 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  t Pager.eState t
31700 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47  o.        ** PAG
31710 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68  ER_ERROR now. Th
31720 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
31730 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20  ly counted as a 
31740 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20  transition.     
31750 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73     ** to ERROR s
31760 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74  tate in the stat
31770 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65  e diagram at the
31780 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
31790 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  e,.        ** si
317a0 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
317b0 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74   the same call t
317c0 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
317d0 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20   will very.     
317e0 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72     ** shortly tr
317f0 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67  ansition the pag
31800 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
31810 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c   OPEN state. Cal
31820 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ling.        ** 
31830 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
31840 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20  te() would fail 
31850 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c  now, as it shoul
31860 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  d not be possibl
31870 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
31880 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  be in ERROR stat
31890 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  e when there are
318a0 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e   zero outstandin
318b0 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20  g page .        
318c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20  ** references.. 
318d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
318e0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
318f0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
31900 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31910 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
31920 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31930 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
31940 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
31950 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
31960 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  k==SHARED_LOCK).
31970 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
31980 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31990 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
319a0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
319b0 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  K).      );.    
319c0 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
319d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
319e0 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
319f0 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20  ->pBackup .     
31a00 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
31a10 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
31a20 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20  ->pPCache)>0 .  
31a30 20 20 20 7c 7c 20 55 53 45 46 45 54 43 48 28 70     || USEFETCH(p
31a40 50 61 67 65 72 29 0a 20 20 20 20 29 29 7b 0a 20  Pager).    )){. 
31a50 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
31a60 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
31a70 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
31a80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31a90 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
31aa0 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
31ab0 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
31ac0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
31ad0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
31ae0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
31af0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
31b00 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
31b10 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
31b20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
31b30 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
31b40 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
31b50 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
31b60 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
31b70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31b80 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
31b90 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
31ba0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
31bb0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
31bc0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
31bd0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
31be0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
31bf0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
31c00 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
31c10 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
31c20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
31c30 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
31c40 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
31c50 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
31c60 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
31c70 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
31c80 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
31c90 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
31ca0 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
31cb0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
31cc0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
31cd0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
31ce0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
31cf0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
31d00 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
31d10 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
31d20 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
31d30 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
31d40 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
31d50 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
31d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
31d70 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
31d80 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
31d90 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
31da0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
31db0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
31dc0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
31dd0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
31de0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31df0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
31e00 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
31e10 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
31e20 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
31e30 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
31e40 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
31e50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31e60 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
31e70 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
31e80 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
31e90 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
31ea0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31eb0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
31ec0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
31ed0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
31ee0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
31f10 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
31f20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
31f30 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
31f40 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
31f50 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
31f60 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
31f70 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
31f80 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
31f90 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
31fa0 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
31fb0 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
31fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31fd0 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
31fe0 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
31ff0 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
32000 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
32010 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
32020 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
32030 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
32040 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
32050 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
32060 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
32070 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
32080 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
32090 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
320a0 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
320b0 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
320c0 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
320d0 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
320e0 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
320f0 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
32100 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
32110 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
32120 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
32130 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
32140 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
32150 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
32160 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
32170 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32180 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
32190 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
321a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
321b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
321c0 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
321d0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
321e0 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
321f0 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
32200 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
32210 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
32220 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
32230 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
32240 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
32250 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
32260 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
32270 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32280 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
32290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
322a0 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
322b0 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
322c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
322d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
322e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
322f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32300 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
32310 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
32320 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
32330 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
32340 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32350 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  N && rc==SQLITE_
32360 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
32370 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
32380 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64  ager, &pPager->d
32390 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61  bSize);.  }.. fa
323a0 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
323b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
323c0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
323d0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  );.    pager_unl
323e0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
323f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32400 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32410 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  PEN );.  }else{.
32420 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
32430 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
32440 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
32450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
32460 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
32470 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
32480 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
32490 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
324a0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
324b0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
324c0 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
324d0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
324e0 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
324f0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
32500 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
32510 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
32520 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
32530 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
32540 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
32550 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
32560 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32570 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
32580 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
32590 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
325a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
325b0 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  f( pPager->nMmap
325c0 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74  Out==0 && (sqlit
325d0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
325e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
325f0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
32600 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
32610 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
32620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
32630 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
32640 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
32650 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
32660 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
32670 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
32680 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
32690 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
326a0 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
326b0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
326c0 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
326d0 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
326e0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
326f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32700 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
32710 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
32720 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
32730 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
32740 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
32750 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
32760 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
32770 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
32780 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
32790 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
327a0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
327b0 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
327c0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
327d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
327e0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
327f0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
32800 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
32810 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
32820 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
32830 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
32840 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
32850 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
32860 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
32870 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
32880 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
32890 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
328a0 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
328b0 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
328c0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
328d0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
328e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
328f0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
32900 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
32910 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
32920 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
32930 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
32940 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
32950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
32960 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
32970 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
32980 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
32990 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
329a0 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
329b0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
329c0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
329d0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
329e0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
329f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
32a00 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
32a10 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
32a20 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
32a30 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
32a40 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
32a50 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
32a60 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
32a70 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
32a80 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
32a90 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
32aa0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
32ab0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
32ac0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
32ad0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
32ae0 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
32af0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
32b00 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
32b10 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
32b20 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
32b30 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
32b40 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
32b50 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
32b60 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
32b70 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
32b80 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
32b90 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
32ba0 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
32bb0 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
32bc0 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
32bd0 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
32be0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
32bf0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
32c00 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
32c10 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
32c20 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
32c30 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
32c40 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
32c50 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
32c60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
32c70 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
32c80 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
32c90 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
32ca0 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
32cb0 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
32cc0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
32cd0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
32ce0 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
32cf0 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
32d00 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
32d10 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
32d20 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
32d30 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
32d40 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
32d50 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
32d60 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
32d70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
32d80 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
32d90 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
32da0 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
32db0 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
32dc0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
32dd0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
32de0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
32df0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
32e00 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
32e10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
32e20 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
32e30 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
32e40 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
32e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
32e60 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
32e70 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
32e80 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
32e90 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
32ea0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
32eb0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
32ec0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
32ed0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
32ee0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
32ef0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
32f00 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
32f10 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
32f20 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
32f30 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
32f40 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
32f50 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
32f60 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
32f70 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
32f80 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
32f90 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
32fa0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
32fb0 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
32fc0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
32fd0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
32fe0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
32ff0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
33000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
33010 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33020 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
33030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
33040 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
33050 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
33060 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
33070 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
33080 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
33090 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
330a0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
330b0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
330c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
330d0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
330e0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
330f0 2f 2a 20 50 41 47 45 52 5f 41 43 51 55 49 52 45  /* PAGER_ACQUIRE
33100 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
33110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33120 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
33130 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
33140 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
33150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
33160 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
33170 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63   WAL file */.  c
33180 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  onst int noConte
33190 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
331a0 47 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f  GER_ACQUIRE_NOCO
331b0 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74  NTENT);..  /* It
331c0 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
331d0 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
331e0 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
331f0 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
33200 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
33210 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
33220 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
33230 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
33240 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
33250 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
33260 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
33270 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
33280 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
33290 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
332a0 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
332b0 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
332c0 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
332d0 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26 20 55   = (pgno!=1 && U
332e0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a  SEFETCH(pPager).
332f0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
33300 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
33310 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
33320 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45  PAGER_ACQUIRE_RE
33330 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20  ADONLY)).#ifdef 
33340 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
33350 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78  .   && pPager->x
33360 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a  Codec==0.#endif.
33370 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
33380 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
33390 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
333a0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
333b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
333c0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
333d0 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c  ( noContent==0 |
333e0 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a  | bMmapOk==0 );.
333f0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
33400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33410 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
33430 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
33440 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
33450 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
33460 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
33470 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
33480 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
33490 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
334a0 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
334b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
334c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
334d0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
334e0 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
334f0 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
33500 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
33510 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
33530 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
33540 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
33550 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
33560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33570 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
33580 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
33590 0a 20 20 20 20 69 66 28 20 69 46 72 61 6d 65 3d  .    if( iFrame=
335a0 3d 30 20 26 26 20 62 4d 6d 61 70 4f 6b 20 29 7b  =0 && bMmapOk ){
335b0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
335c0 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72  ta = 0;..      r
335d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74  c = sqlite3OsFet
335e0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a  ch(pPager->fd, .
335f0 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28            (i64)(
33600 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
33610 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
33620 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
33630 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20  Data.      );.. 
33640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33650 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
33660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
33670 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
33680 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20  GER_READER ){.  
33690 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
336a0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
336b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
336c0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
336d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
336e0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
336f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
33700 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
33710 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
33720 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b  o, pData, &pPg);
33730 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33740 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33750 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
33760 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
33770 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
33780 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
33790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
337a0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
337b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
337c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
337d0 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
337e0 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
337f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33800 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
33810 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33830 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33840 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33860 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33870 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
33880 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
33890 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
338a0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
338b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
338c0 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
338d0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
338e0 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
338f0 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
33900 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
33910 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
33920 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
33930 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33940 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
33950 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
33960 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
33970 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
33980 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
33990 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
339a0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
339b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
339c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
339d0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
339e0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
339f0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
33a00 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
33a10 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
33a20 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
33a30 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
33a40 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
33a50 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
33a60 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
33a70 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
33a80 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
33a90 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
33aa0 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
33ab0 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
33ac0 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
33ad0 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
33ae0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
33af0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
33b00 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
33b10 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b  AGER_STAT_HIT]++
33b20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
33b30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
33b40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
33b50 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
33b60 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
33b70 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
33b80 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
33b90 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
33ba0 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  /..    pPg = *pp
33bb0 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
33bc0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
33bd0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
33be0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
33bf0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
33c00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
33c10 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
33c20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
33c30 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
33c40 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
33c50 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
33c60 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
33c70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
33c80 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
33c90 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
33ca0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
33cb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33cc0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
33cd0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33ce0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
33cf0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
33d00 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
33d10 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
33d20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
33d30 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
33d40 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
33d50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
33d60 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
33d70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33d80 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33da0 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
33db0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
33dc0 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
33dd0 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
33de0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
33df0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
33e00 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
33e10 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
33e20 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
33e30 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
33e40 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
33e50 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
33e60 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
33e70 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
33e80 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
33e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
33ea0 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
33eb0 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
33ec0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
33ed0 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
33ee0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
33ef0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
33f00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33f10 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
33f20 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
33f30 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
33f40 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
33f50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
33f60 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
33f70 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
33f80 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
33f90 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
33fa0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
33fb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
33fc0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
33fd0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
33fe0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
33ff0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
34000 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
34010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34020 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34030 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
34040 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
34050 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
34060 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
34070 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
34080 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
34090 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
340a0 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
340b0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
340c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
340d0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
340e0 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d  ger) && bMmapOk=
340f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
34100 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
34110 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
34120 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
34130 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
34140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34150 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34160 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34180 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34190 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
341a0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
341b0 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
341c0 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
341d0 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
341e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
341f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34200 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34210 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34220 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
34230 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
34240 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
34250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34260 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
34270 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
34280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
34290 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
342a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
342b0 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
342c0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
342d0 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
342e0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
342f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34300 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
34310 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
34320 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
34330 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
34340 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
34350 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
34360 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34370 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
34380 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
34390 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
343a0 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
343b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
343c0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
343d0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
343e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
343f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34400 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
34410 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
34420 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
34430 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
34440 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34450 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
34460 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34470 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
34480 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34490 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
344a0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
344b0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
344c0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
344d0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
344e0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
344f0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
34500 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
34510 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
34520 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
34530 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
34540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34550 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
34560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34570 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34580 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
34590 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
345a0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c  R_ERROR );.  sql
345b0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
345c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
345d0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
345e0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
345f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
34600 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
34610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
34620 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
34630 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
34640 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
34650 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
34660 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
34670 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
34680 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
34690 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
346a0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
346b0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
346c0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
346d0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
346e0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
346f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
34700 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
34710 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
34720 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
34730 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
34740 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
34750 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
34760 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 52 65  ){.      pagerRe
34770 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
34780 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34790 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
347a0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
347b0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
347c0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
347d0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
347e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
347f0 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
34800 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
34810 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
34820 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
34830 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
34840 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
34850 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
34860 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
34870 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
34880 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
34890 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
348a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
348b0 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
348c0 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
348d0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
348e0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
348f0 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
34900 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
34910 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
34920 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
34930 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
34940 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
34950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34960 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
34970 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
34980 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
34990 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
349a0 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
349b0 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
349c0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
349d0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
349e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
349f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
34a00 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
34a10 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
34a20 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
34a30 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
34a40 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
34a50 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
34a60 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
34a70 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
34a80 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
34a90 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
34aa0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
34ab0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
34ac0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
34ad0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
34ae0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
34af0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
34b00 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
34b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
34b20 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
34b30 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
34b40 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
34b50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
34b60 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
34b70 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
34b80 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
34b90 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
34ba0 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
34bb0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
34bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34bd0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
34be0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
34bf0 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
34c00 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
34c10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
34c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
34c40 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
34c50 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
34c60 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
34c70 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
34c80 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
34c90 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
34ca0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
34cb0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
34cc0 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
34cd0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
34ce0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
34cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34d00 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
34d10 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
34d20 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
34d30 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
34d40 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
34d50 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
34d60 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
34d70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
34d80 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
34d90 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
34da0 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
34db0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
34dc0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
34dd0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
34de0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
34df0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
34e00 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
34e10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
34e20 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
34e30 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
34e40 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
34e50 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
34e60 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
34e70 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
34e80 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
34e90 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
34ea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34eb0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
34ec0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
34ed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
34ee0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
34ef0 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
34f00 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
34f10 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
34f20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
34f30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
34f40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
34f50 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
34f60 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
34f70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34f80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34f90 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
34fa0 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
34fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
34fc0 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
34fd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
34fe0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
34ff0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
35000 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
35010 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ATE|.          (
35020 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
35030 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
35040 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
35050 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
35060 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
35070 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
35080 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
35090 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
350a0 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64         );.  #ifd
350b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
350c0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
350d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
350e0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
350f0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
35100 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35110 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
35120 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
35130 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
35140 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65        );.  #else
35150 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
35160 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
35170 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
35180 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
35190 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65   flags, 0);.  #e
351a0 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
351b0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
351c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
351d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
351e0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
351f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
35200 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
35210 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
35220 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
35230 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
35240 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
35250 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
35260 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
35280 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
35290 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
352a0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
352b0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
352c0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
352d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
352e0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
352f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
35300 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
35310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
35320 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35330 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
35340 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
35350 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
35360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35370 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
35380 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
35390 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
353a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
353b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
353c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
353d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
353e0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
353f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
35400 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
35410 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
35420 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
35430 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
35440 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35450 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
35460 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
35470 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
35480 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
35490 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
354a0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
354b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
354c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
354d0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
354e0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
354f0 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
35500 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
35510 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35520 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
35530 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
35540 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
35550 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
35560 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
35570 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
35580 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
35590 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
355a0 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
355b0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
355c0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
355d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
355e0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
355f0 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
35600 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
35610 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
35620 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
35630 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
35640 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
35650 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
35660 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
35670 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
35680 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
35690 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
356a0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
356b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
356c0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
356d0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
356e0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
356f0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
35700 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
35710 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
35720 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
35730 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
35740 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
35750 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
35760 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
35770 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
35780 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
35790 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
357a0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
357b0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
357c0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
357d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
357e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
357f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
35800 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
35810 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
35820 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35830 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
35840 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
35850 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
35860 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
35870 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
35880 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
35890 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
358a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
358b0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
358c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
358d0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
358e0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
358f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
35900 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
35910 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
35920 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
35930 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
35940 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
35950 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
35960 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35970 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
35980 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
35990 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
359a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
359b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
359c0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
359d0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
359e0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
359f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
35a00 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
35a10 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
35a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35a40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35a50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
35a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
35a70 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
35a80 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
35a90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
35aa0 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
35ab0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
35ac0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
35ad0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
35ae0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
35af0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
35b00 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
35b10 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
35b20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
35b30 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
35b40 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
35b50 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
35b60 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
35b70 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
35b80 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
35b90 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
35ba0 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
35bb0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
35bc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35bd0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
35be0 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
35bf0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
35c00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35c10 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
35c20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
35c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35c40 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
35c50 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
35c60 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
35c70 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
35c80 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
35c90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
35ca0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
35cb0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
35cc0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
35cd0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
35ce0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
35cf0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
35d00 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
35d10 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
35d20 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
35d30 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
35d40 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
35d50 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
35d60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35d70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
35d80 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
35d90 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
35da0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
35db0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
35dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35dd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
35df0 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
35e00 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
35e10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
35e20 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
35e30 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
35e40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35e50 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
35e60 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
35e70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
35e80 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
35e90 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
35ea0 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
35eb0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
35ec0 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
35ed0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
35ee0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
35ef0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
35f00 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
35f10 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
35f20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
35f30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
35f40 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
35f50 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
35f60 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
35f70 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
35f80 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
35f90 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
35fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
35fb0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
35fc0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35fd0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
35fe0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
35ff0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36000 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
36010 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
36020 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36030 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36040 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36050 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36060 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
36070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
36080 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
36090 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
360a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
360b0 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
360c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
360d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
360e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
360f0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
36100 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36110 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36120 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
36130 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
36140 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
36150 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36170 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
36180 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
36190 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
361a0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
361b0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
361c0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
361d0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
361e0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
361f0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
36200 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
36210 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
36220 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
36230 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
36240 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
36250 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
36260 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
36270 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
36280 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
36290 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
362a0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
362b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
362c0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
362d0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
362e0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
362f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36300 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
36310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36320 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
36330 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
36340 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
36350 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36360 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20  n has already . 
36370 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64   ** been started
36380 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
36390 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
363a0 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69  t be open at thi
363b0 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74  s point..  ** It
363c0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
363d0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
363e0 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ate..  */.  asse
363f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36400 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36410 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
36420 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36430 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36440 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36450 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36460 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
36470 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
36480 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36490 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
364a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
364b0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65  ror has been pre
364c0 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64  viously detected
364d0 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d  , report the sam
364e0 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61  e error.  ** aga
364f0 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  in. This should 
36500 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20  not happen, but 
36510 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64  the check provid
36520 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  es robustness. *
36530 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
36540 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
36550 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
36560 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
36570 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  Higher-level rou
36580 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c  tines never call
36590 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
365a0 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  f database is no
365b0 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e  t.  ** writable.
365c0 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77    But check anyw
365d0 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62  ay, just for rob
365e0 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
365f0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
36600 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75  readOnly) ) retu
36610 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
36620 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
36630 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  g);..  /* The jo
36640 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
36650 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48   to be opened. H
36660 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
36670 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ines have alread
36680 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20  y.  ** obtained 
36690 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
366a0 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65  cks to begin the
366b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
366c0 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a  on, but the.  **
366d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
366e0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
366f0 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
36700 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
36710 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  the case..  **. 
36720 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65   ** This is done
36730 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
36740 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
36750 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20  eDirty() on the 
36760 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  page. .  ** Othe
36770 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72  rwise, if it wer
36780 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c  e done after cal
36790 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
367a0 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74  heMakeDirty(), t
367b0 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f  hen.  ** an erro
367c0 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e  r might occur an
367d0 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c  d the pager woul
367e0 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54  d end up in WRIT
367f0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a  ER_LOCKED state.
36800 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20    ** with pages 
36810 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
36820 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
36830 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
36840 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36850 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
36860 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
36870 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
36880 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
36890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
368a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
368b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
368c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
368d0 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
368e0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
368f0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36900 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  er) );..  /* Mar
36910 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
36920 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
36930 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
36940 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
36950 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
36960 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
36970 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
36980 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
36990 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
369a0 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
369b0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
369c0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
369d0 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65  pPg) ){.    asse
369e0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
369f0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65  (pPager) );.  }e
36a00 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  lse{.  .    /* T
36a10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
36a20 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
36a30 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
36a40 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
36a50 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
36a60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
36a70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
36a80 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
36a90 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
36aa0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
36ab0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
36ac0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
36ad0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
36ae0 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72   if( !pageInJour
36af0 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67  nal(pPg) && !pag
36b00 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36b10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
36b20 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
36b30 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
36b40 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
36b50 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
36b60 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ize && isOpen(pP
36b70 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
36b80 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
36b90 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
36ba0 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69  Data2;.        i
36bb0 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
36bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
36bd0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
36be0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
36bf0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
36c00 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
36c10 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
36c20 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
36c30 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
36c40 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
36c50 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
36c60 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
36c70 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
36c80 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
36c90 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
36ca0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
36cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36cc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
36cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36ce0 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  ff );.        CO
36cf0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
36d00 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
36d10 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
36d20 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
36d30 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
36d40 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
36d50 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
36d60 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
36d70 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
36d80 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
36d90 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
36da0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
36db0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
36dc0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
36dd0 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
36de0 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
36df0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
36e00 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
36e10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
36e20 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
36e30 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
36e40 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
36e50 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
36e60 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
36e70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
36e80 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
36e90 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
36ea0 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
36eb0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
36ec0 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
36ed0 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
36ee0 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
36ef0 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
36f00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
36f10 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
36f20 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
36f30 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
36f40 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
36f50 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
36f60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
36f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36f80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
36f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36fa0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
36fb0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
36fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
36fd0 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20  iOff+4);.       
36fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36ff0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37000 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
37010 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37020 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65  >jfd, iOff+pPage
37030 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63  r->pageSize+4, c
37040 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  ksum);.        i
37050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37060 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
37070 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
37080 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
37090 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
370a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
370c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
370d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
370e0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
370f0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
37100 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
37110 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
37120 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
37130 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
37140 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
37150 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
37160 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
37170 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37180 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
37190 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
371a0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
371b0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
371c0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
371d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
371e0 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61  alOff += 8 + pPa
371f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
37200 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
37210 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
37220 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37230 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
37240 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37250 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
37260 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37270 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
37290 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
372a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
372b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
372c0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
372d0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
372e0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
372f0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
37300 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
37310 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37340 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37350 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
37360 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
37370 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
37380 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37390 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
373a0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
373b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
373c0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
373d0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
373e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
373f0 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
37400 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
37410 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
37420 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37430 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37440 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37450 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37460 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37470 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
37480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
37490 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
374a0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
374b0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
374c0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
374d0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
374e0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
374f0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
37500 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
37510 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
37520 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37530 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
37540 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
37550 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
37560 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
37570 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
37580 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
37590 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
375a0 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
375b0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
375c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
375d0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
375e0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
375f0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
37600 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
37610 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
37620 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
37630 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
37640 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
37650 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
37660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
37680 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
37690 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
376a0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
376b0 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
376c0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
376d0 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
376e0 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
376f0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
37700 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
37710 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
37720 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
37730 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
37740 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
37750 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
37760 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
37770 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
37780 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
37790 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
377a0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
377b0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
377c0 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
377d0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
377e0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
377f0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
37800 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
37810 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
37820 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
37830 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
37840 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
37850 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
37860 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
37870 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
37880 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
37890 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
378a0 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
378b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
378c0 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
378d0 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
378e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
378f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
37900 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
37910 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
37920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
37930 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
37940 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
37950 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
37960 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
37970 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
37980 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
37990 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
379a0 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  e);..  assert( (
379b0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
379c0 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a 20  DR_MMAP)==0 );. 
379d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
379e0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
379f0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
37a00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37a10 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
37a20 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
37a30 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
37a40 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
37a50 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
37a60 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
37a70 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
37a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
37a90 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
37aa0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
37ab0 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
37ac0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
37ad0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
37ae0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
37af0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
37b00 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
37b10 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
37b20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37b30 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
37b40 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
37b50 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
37b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37b70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
37b80 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
37b90 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
37ba0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
37bb0 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
37bc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
37bd0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
37be0 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
37bf0 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68 69 73  C bit to 1. This
37c00 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
37c10 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20  annot allow.    
37c20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
37c30 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
37c40 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
37c50 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
37c60 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
37c70 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
37c80 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
37c90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37ca0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
37cb0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
37cc0 4e 4f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  NOSYNC)==0 );.  
37cd0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
37ce0 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
37cf0 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20 20 20 20 2f  G_NOSYNC;..    /
37d00 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
37d10 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
37d20 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
37d30 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
37d40 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
37d50 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
37d60 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
37d70 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
37d80 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
37d90 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
37da0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
37db0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
37dc0 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
37dd0 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
37de0 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
37df0 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
37e00 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50   nPageCount = pP
37e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
37e20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
37e30 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
37e40 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
37e50 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
37e60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
37e70 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
37e80 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
37e90 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
37ea0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
37eb0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
37ec0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
37ed0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
37ee0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
37ef0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
37f00 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
37f10 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
37f20 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
37f30 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
37f40 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
37f50 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
37f60 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
37f70 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
37f80 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
37f90 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
37fa0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
37fb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
37fc0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
37fd0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
37fe0 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
37ff0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
38000 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
38010 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
38020 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
38030 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
38040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38060 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
38070 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
38080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
38090 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
380a0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
380b0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
380c0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
380d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
380e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
380f0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
38100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38110 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
38120 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
38130 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
38140 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
38150 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
38160 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
38170 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
38180 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
38190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
381a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
381b0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
381c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
381d0 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
381e0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
381f0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
38200 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
38210 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
38220 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
38230 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
38240 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
38250 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
38260 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
38270 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
38280 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
38290 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
382a0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
382b0 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
382c0 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
382d0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
382e0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
382f0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
38300 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
38310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
38320 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
38330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38340 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
38350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
38360 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f  EMDB );.      fo
38370 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
38380 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
38390 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
383a0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
383b0 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
383c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
383d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
383e0 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
383f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
38400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
38410 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
38420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38430 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
38440 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
38450 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
38460 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29 21 3d  LLFLAG_NOSYNC)!=
38470 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
38480 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
38490 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
384a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
384b0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
384c0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
384d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
384e0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
384f0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
38500 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
38510 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
38520 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
38530 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
38540 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
38550 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
38560 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
38570 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
38580 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
38590 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
385a0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
385b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
385c0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
385d0 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
385e0 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
385f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
38600 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
38610 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
38620 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
38630 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
38640 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
38650 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
38660 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
38670 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
38680 6f 75 67 68 0a 2a 2a 20 74 68