/ Hex Artifact Content
Login

Artifact 0b6bd5442733b2e08d0673de6cdafe3e7ab0b5715e4844ac836ab346b1d9ed89:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9650: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9660: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9670: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9680: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9690: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96a0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96b0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96c0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96d0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
96e0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
96f0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9700: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9720: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9730: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9740: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9750: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9760: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9770: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9780: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9790: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97a0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97b0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97c0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97d0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
97e0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
97f0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9800: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9810: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9820: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9830: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9840: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9850: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9870: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9880: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9890: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98a0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
98e0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
98f0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9900: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9910: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9920: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9940: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9950: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9960: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9970: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9980: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9990: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99a0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99b0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99c0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99d0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
99e0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
99f0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a30: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a40: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a50: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a60: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a70: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9a80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9a90: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9aa0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ab0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ac0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9ad0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9ae0: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9af0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b00: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b10: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b20: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b30: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b40: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b50: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b60: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b70: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9b80: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9b90: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9ba0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bb0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9bc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bd0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9be0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9bf0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c00: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c20: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c30: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c50: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c60: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9c80: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9c90: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9ca0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cb0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9cc0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9ce0: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9cf0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d00: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d10: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d20: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d30: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d50: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d60: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d70: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9d80: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9d90: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9da0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9db0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9dc0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9dd0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9de0: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9df0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e10: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e30: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e40: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e70: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9e80: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9e90: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ea0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9eb0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ec0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ed0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9ee0: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9ef0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f00: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f10: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f20: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f30: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f40: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f50: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f60: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f70: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9f80: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9f90: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fa0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fb0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fc0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9fd0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9fe0: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ff0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a010: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a030: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a040: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a050: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a060: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a070: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a080: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a090: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0a0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0c0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a0e0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a0f0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a110: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a120: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a130: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a140: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a150: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a160: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a170: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a180: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a190: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1a0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1b0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1c0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1d0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a1e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a1f0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a200: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a210: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a220: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a230: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a240: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a250: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a260: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a270: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a280: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a290: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2a0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2b0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a2e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a310: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a320: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a330: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a340: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a350: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a360: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a390: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3d0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a3e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a3f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a400: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a410: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a420: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a430: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a450: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a460: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a470: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a480: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a490: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4a0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4d0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a4e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a510: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a520: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a540: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a550: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a560: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a570: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a580: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a590: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5b0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a5f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a600: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a610: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a620: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a630: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a640: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a660: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a670: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a690: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6a0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6b0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6c0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6d0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a6e0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a6f0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a700: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a710: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a720: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a740: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a750: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a760: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a770: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a780: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a790: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7a0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a7e0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a800: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a810: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a820: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a840: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a850: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a860: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a870: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a880: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a890: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8e0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8f0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a900: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a920: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a930: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a940: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a950: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a960: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a970: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a980: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a990: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9c0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
a9e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a9f0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa00: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa10: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa30: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa40: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa50: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa60: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa70: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aa80: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aa90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aaa0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aac0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aad0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
aae0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aaf0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab10: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab20: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab60: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab70: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ab80: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ab90: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
aba0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abb0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abc0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abd0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
abf0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac00: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac10: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac20: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac30: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac40: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac50: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac60: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac70: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ac80: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ac90: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
aca0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acb0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
acc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acd0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ace0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
acf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad00: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad10: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad20: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad30: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad40: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad50: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ad80: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ad90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ada0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
adb0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
adc0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
add0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ade0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
adf0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae00: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae10: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae20: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae30: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae50: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae60: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae70: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
ae80: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
ae90: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aea0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aec0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aed0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
aee0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
aef0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af00: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af10: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af20: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af30: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af40: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af50: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af60: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af70: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
af80: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
af90: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afa0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afb0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afc0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
afd0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
afe0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
aff0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b000: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b010: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b020: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b030: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b040: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b050: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b060: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b070: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b080: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b090: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0a0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0b0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0c0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b0e0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b0f0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b100: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b110: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b120: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b130: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b140: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b150: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b160: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b170: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b180: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b190: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1a0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1d0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b1e0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b1f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b200: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b210: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b220: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b230: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b240: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b250: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b260: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b270: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b280: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b290: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2a0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2d0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b2e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b2f0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b300: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b310: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b320: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b330: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b340: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b350: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b360: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b370: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b380: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b390: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3a0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3b0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3e0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b3f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b400: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b410: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b420: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b430: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b440: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b450: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b460: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b470: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b480: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b490: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4a0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4b0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b4e0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b4f0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b500: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b510: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b520: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b530: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b540: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b550: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b560: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b570: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b580: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b590: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5a0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5b0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5c0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5d0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b5e0: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b5f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b600: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b610: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b620: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b630: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b640: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b650: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b660: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b670: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b680: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b690: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6a0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6c0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6d0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b6e0: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b6f0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b700: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b720: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b730: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b740: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b750: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b760: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b770: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b780: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b790: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7a0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7b0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7d0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b7e0: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b7f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b800: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b810: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b820: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b830: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b840: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b850: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b870: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b880: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b890: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8a0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8b0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8c0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8d0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b8e0: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b8f0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b900: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b910: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b920: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b930: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b940: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b950: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b960: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b970: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b980: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b990: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9a0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9b0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9c0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b9e0: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b9f0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba20: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba30: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba40: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba60: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba70: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
ba80: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
ba90: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
baa0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bab0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bac0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bad0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bae0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
baf0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb20: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bb80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bb90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bba0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbb0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbc0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbd0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bbe0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bbf0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc00: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc10: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc20: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc30: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc40: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc60: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc70: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bc80: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bc90: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bca0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcb0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bcc0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bcf0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd00: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd10: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd20: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd30: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd40: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd50: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bd80: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bd90: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bda0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdb0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bdc0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdd0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
bde0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bdf0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be00: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be10: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be20: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be50: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
be80: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
be90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bea0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
beb0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bec0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bed0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bee0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bef0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf00: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf10: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf30: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf40: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf50: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bf80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bf90: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfa0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfb0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfc0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bfd0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
bfe0: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
bff0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c000: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c010: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c020: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c030: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c040: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c050: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c060: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c070: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c080: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c090: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0b0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0c0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0d0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c0e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c0f0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c100: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c110: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c140: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c150: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c160: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c170: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c180: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c190: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1b0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c1e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c1f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c200: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c210: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c220: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c230: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c240: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c250: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c260: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c270: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c280: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c290: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2a0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2b0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2c0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2d0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c310: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c320: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c330: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c340: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c350: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c360: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c370: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c380: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c390: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3a0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3b0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3c0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3d0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c3e0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c3f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c400: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c410: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c420: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c430: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c440: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c450: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c460: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c470: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c480: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c490: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4c0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4d0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c4e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c4f0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c500: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c510: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c520: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c530: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c540: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c550: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c560: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c570: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c580: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c590: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5a0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5b0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5c0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c5e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c5f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c600: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c610: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c620: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c630: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c640: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c650: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c660: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c680: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c690: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6b0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6c0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6d0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c6e0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c6f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c700: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c710: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c720: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c730: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c740: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c750: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c760: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c770: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c780: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c790: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c7e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c7f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c800: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c810: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c820: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c830: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c840: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c850: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c860: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c870: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c880: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c890: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8b0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8d0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c8e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c8f0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c900: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c910: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c920: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c930: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c940: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c950: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c960: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c970: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c990: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9a0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
c9e0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
c9f0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca10: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca20: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca50: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca60: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
ca80: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
caa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cac0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
cad0: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cae0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
caf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cb00: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cb10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
cb20: 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51 4c  ize>0 && (dc&SQL
cb30: 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
cb40: 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20 72  ATOMIC) ){.    r
cb50: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
cb60: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
cb70: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cb80: 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20  C_WRITE.  {.    
cb90: 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50  int nSector = pP
cba0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
cbb0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
cbc0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
cbd0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
cbe0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
cbf0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
cc00: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
cc10: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
cc20: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
cc30: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
cc40: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
cc50: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
cc60: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
cc70: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
cc80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
cc90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
cca0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ccb0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
ccc0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23  PG_SZ(pPager);.#
ccd0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
cce0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  0;.}../*.** If S
ccf0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cd00: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
cd10: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
cd20: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
cd30: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
cd40: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
cd50: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
cd60: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
cd70: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cd80: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cd90: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cda0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cdb0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
cdc0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cdd0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
cde0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
cdf0: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
ce00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ce10: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
ce20: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
ce30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
ce40: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
ce50: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
ce60: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
ce70: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
ce80: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
ce90: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
cea0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
ceb0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
cec0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
ced0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
cee0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cef0: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cf00: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cf10: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cf20: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cf30: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cf40: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cf50: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cf60: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cf70: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
cf80: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
cf90: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
cfa0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cfb0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
cfc0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cfd0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
cfe0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
cff0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
d000: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
d010: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
d020: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
d030: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
d040: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
d050: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
d060: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
d070: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
d080: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
d090: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
d0a0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
d0b0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
d0c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
d0d0: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
d0e0: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
d0f0: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
d100: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
d110: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
d120: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
d130: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
d140: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
d150: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
d160: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
d170: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
d180: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
d190: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
d1a0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
d1b0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
d1c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
d1d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d1e0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
d1f0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
d200: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d210: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
d220: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
d230: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
d240: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
d250: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
d260: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
d270: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
d280: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
d290: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
d2a0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
d2b0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
d2c0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d2d0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d2e0: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d2f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d300: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d310: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d320: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d330: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d340: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d350: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d360: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d370: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d380: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d390: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d3a0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d3b0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d3c0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d3d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d3e0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d3f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d400: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d410: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d420: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d430: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d440: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d450: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d460: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d470: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d480: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d490: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d4a0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d4b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d4c0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d4d0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d4e0: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d4f0: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d500: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d510: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d520: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d530: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d540: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d550: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d560: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d570: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d580: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d590: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d5a0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d5b0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d5c0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d5d0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d5e0: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d5f0: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d600: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d610: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d620: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d630: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d640: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d650: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d660: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d670: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d680: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d690: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d6a0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d6b0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d6c0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d6e0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d6f0: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d710: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d720: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d730: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d740: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d750: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d760: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d770: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d780: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7a0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d7b0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d7c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d7d0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d7f0: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d800: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d810: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d820: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d830: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d840: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d850: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d860: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d870: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d880: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d890: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d8a0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d8b0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d8c0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d8d0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d8e0: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d8f0: 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31 36     || len>szJ-16
d900: 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20  .   || len==0 . 
d910: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d920: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
d930: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
d940: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
d950: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d960: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d970: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
d980: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
d990: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
d9a0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
d9b0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d9c0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
d9d0: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
d9e0: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
d9f0: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
da00: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
da10: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
da20: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
da30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
da40: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
da50: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
da60: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
da70: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
da80: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
da90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
daa0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
dab0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
dac0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
dad0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
dae0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
daf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
db00: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
db10: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
db20: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
db30: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
db40: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
db50: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
db60: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
db70: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
db80: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
db90: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
dba0: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
dbb0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
dbc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
dbe0: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
dbf0: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
dc00: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
dc10: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
dc20: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
dc30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc40: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
dc50: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
dc60: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
dc70: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
dc80: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
dc90: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
dca0: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
dcb0: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
dcc0: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
dcd0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
dce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
dd00: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
dd20: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
dd40: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
dd90: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
dda0: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
ddb0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
ddc0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
ddd0: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
dde0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
ddf0: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
de00: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
de10: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
de20: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
de30: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
de40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
de50: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
de60: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
de70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
de80: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
de90: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
dea0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
deb0: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
dec0: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
ded0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
dee0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
def0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
df00: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
df10: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
df20: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
df30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
df40: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
df50: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
df60: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
df70: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
df80: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
df90: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
dfa0: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
dfb0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
dfc0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
dfd0: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
dfe0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
dff0: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
e000: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e010: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
e020: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
e030: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
e040: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
e050: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e060: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e070: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
e080: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
e090: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
e0a0: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
e0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
e0c0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
e0d0: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
e0e0: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
e0f0: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
e100: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
e110: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
e120: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
e130: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
e140: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
e150: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
e160: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
e170: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
e180: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e190: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
e1a0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
e1b0: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
e1c0: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
e1d0: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
e1e0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
e1f0: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
e200: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
e210: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
e220: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
e230: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
e240: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
e250: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
e260: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
e270: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
e280: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
e290: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
e2a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
e2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
e2c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
e2d0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
e2e0: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
e2f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e320: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
e330: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e340: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
e350: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
e360: 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
e370: 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
e380: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
e390: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
e3a0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
e3b0: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
e3c0: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
e3d0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
e3e0: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
e3f0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
e400: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
e410: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
e420: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
e430: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
e440: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e450: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e460: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
e470: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
e480: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
e490: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
e4a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e4b0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
e4c0: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
e4d0: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
e4e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e4f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e500: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
e510: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
e520: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
e530: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
e540: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
e550: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
e560: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
e570: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
e580: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e590: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
e5a0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
e5b0: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
e5c0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
e5d0: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
e5e0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
e5f0: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
e600: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
e610: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
e620: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e630: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
e640: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
e650: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
e660: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
e670: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
e680: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e690: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
e6a0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
e6b0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e6c0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
e6d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e6e0: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
e6f0: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
e700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e710: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
e720: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
e730: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e740: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
e750: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
e760: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e770: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
e780: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e790: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
e7a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e7b0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e7c0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e7d0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
e7e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
e7f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
e800: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
e810: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
e820: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e830: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
e840: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
e850: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
e860: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
e870: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
e880: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
e890: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
e8a0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e8b0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e8c0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e8d0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e8e0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e8f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e900: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e910: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e920: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e930: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e940: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e950: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e960: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e970: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e980: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e990: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e9a0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e9b0: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e9c0: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e9d0: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
e9e0: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
e9f0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
ea00: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
ea10: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
ea20: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
ea30: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
ea40: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
ea50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ea60: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
ea70: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
ea80: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
ea90: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
eaa0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
eab0: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
eac0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
ead0: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
eae0: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
eaf0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
eb00: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
eb10: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
eb40: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
eb50: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
eb60: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
eb90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
eba0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ebb0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
ebc0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
ebd0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
ebe0: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
ebf0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ec00: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
ec10: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
ec20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
ec30: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
ec40: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
ec50: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
ec60: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
ec70: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
ec80: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
ec90: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
eca0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
ecb0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
ecc0: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
ecd0: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
ece0: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
ecf0: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ed00: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ed10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
ed20: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ed30: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
ed40: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
ed50: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
ed60: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
ed70: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
ed80: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
ed90: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
eda0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edb0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
edc0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
edd0: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
ede0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
edf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ee00: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
ee10: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
ee20: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ee30: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
ee40: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ee50: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
ee60: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
ee70: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
ee80: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
ee90: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
eea0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
eeb0: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
eec0: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
eed0: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
eee0: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
eef0: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
ef00: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
ef10: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
ef20: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
ef30: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
ef40: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
ef50: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
ef60: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
ef70: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
ef80: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
ef90: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
efa0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
efb0: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
efc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
efd0: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
efe0: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
eff0: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
f000: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
f010: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
f020: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
f030: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
f040: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
f050: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
f060: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
f070: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
f080: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
f090: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
f0a0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
f0b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
f0c0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
f0d0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
f0e0: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
f0f0: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
f100: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
f110: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
f120: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
f130: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
f140: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
f150: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
f160: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
f170: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
f180: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
f190: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
f1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f1b0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
f1c0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f1d0: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
f1e0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
f1f0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
f200: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
f210: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
f220: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
f230: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
f240: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
f250: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
f260: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
f270: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
f280: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
f290: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
f2a0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
f2b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
f2c0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
f2d0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f2e0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
f2f0: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
f300: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
f310: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
f320: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f330: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
f340: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
f350: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
f360: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
f370: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f380: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
f390: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
f3a0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
f3b0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f3c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f3d0: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
f3e0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
f3f0: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
f400: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
f410: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f420: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f430: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
f440: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
f450: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
f460: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
f470: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
f480: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f490: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f4a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f4b0: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
f4c0: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
f4d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
f4e0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f4f0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f500: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
f510: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f520: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
f530: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
f540: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
f550: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
f560: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
f570: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
f580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
f590: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
f5a0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
f5b0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
f5c0: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
f5d0: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
f5e0: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
f5f0: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
f600: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
f610: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
f620: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
f630: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f640: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
f650: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
f660: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
f670: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
f680: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
f690: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
f6a0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
f6b0: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
f6c0: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
f6d0: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
f6e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
f6f0: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
f700: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
f710: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
f720: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
f730: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
f740: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
f750: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
f760: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
f770: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
f780: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
f790: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
f7a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
f7b0: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
f7c0: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
f7d0: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
f7e0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
f7f0: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
f800: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
f810: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
f820: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
f830: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
f840: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
f850: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
f860: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
f870: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
f880: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
f890: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
f8a0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f8b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f8c0: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f8d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f8e0: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f8f0: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f900: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f910: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f920: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f930: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f940: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f950: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f960: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f970: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f980: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f990: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f9a0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f9b0: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f9c0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f9d0: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
f9e0: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
f9f0: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
fa00: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
fa10: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
fa20: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
fa30: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
fa40: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
fa50: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
fa60: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
fa70: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
fa80: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
fa90: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
faa0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
fab0: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
fac0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
fad0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
fae0: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
faf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
fb00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fb10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
fb20: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
fb30: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
fb40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fb50: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
fb60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fb70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
fb80: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
fb90: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
fba0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
fbb0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
fbc0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
fbd0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
fbe0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
fbf0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
fc00: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
fc10: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
fc20: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
fc30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fc40: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
fc50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
fc60: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
fc70: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
fc80: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
fc90: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
fca0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
fcb0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
fcc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
fcd0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
fce0: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
fcf0: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
fd00: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
fd10: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
fd20: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
fd30: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
fd40: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
fd50: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
fd60: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
fd70: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
fd80: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
fd90: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
fda0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
fdb0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
fdc0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
fdd0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
fde0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
fdf0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
fe00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
fe10: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
fe20: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
fe30: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
fe40: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
fe50: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
fe60: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
fe70: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
fe80: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
fe90: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
fea0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
feb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
fec0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
fed0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
fee0: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
fef0: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
ff00: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
ff10: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
ff20: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
ff30: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
ff40: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
ff50: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ff60: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
ff70: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
ff80: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffa0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
ffb0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
ffc0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
ffd0: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
ffe0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
fff0: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
10000 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
10010 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
10020 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10040 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
10050 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
10060 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
10070 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
10080 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
10090 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
100a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
100b0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
100c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
100d0 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
100e0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
100f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
10100 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
10110 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
10120 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
10130 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
10140 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
10150 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
10160 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
10170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10180 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
10190 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
101a0 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
101b0 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
101c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
101d0 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
101e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
101f0 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
10200 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
10210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10220 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
10230 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
10240 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
10250 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10260 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
10270 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
10280 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
10290 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
102a0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
102b0 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
102c0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
102d0 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
102e0 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
102f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
10300 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
10310 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
10320 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
10330 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
10340 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
10350 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
10360 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
10370 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
10380 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
10390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
103a0 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
103b0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
103c0 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
103d0 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
103e0 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
103f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10410 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
10420 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
10430 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
10440 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
10450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10460 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
10470 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
10480 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
10490 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
104a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
104b0 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
104c0 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
104d0 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
104e0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
104f0 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
10500 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
10510 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
10520 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
10530 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
10540 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
10550 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
10560 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10570 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10580 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
10590 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
105a0 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
105b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
105c0 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
105d0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
105e0 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
105f0 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10600 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10610 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
10620 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
10630 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
10640 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10650 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
10660 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10680 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
10690 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
106a0 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
106b0 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
106c0 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
106d0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
106e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
106f0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10700 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10710 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
10720 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
10730 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
10740 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10750 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10760 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
10770 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
10780 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
10790 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
107a0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
107b0 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
107c0 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
107d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
107e0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
107f0 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
10800 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
10810 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
10820 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
10830 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
10840 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
10850 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
10860 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
10870 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
10880 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
10890 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
108a0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
108b0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
108c0 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
108d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
108e0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
108f0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10900 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10910 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10920 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10930 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10940 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
10950 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
10960 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
10970 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
10980 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
10990 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
109a0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
109b0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
109c0 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
109d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
109e0 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
109f0 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10a00 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10a10 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10a20 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
10a50 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
10a60 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
10a70 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
10a80 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
10a90 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
10aa0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10ab0 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10ac0 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10ad0 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10ae0 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10af0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10b00 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10b10 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10b20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10b30 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10b40 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
10b50 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
10b60 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
10b70 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
10b80 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
10b90 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
10ba0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10bb0 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10bc0 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10bd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10be0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10bf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10c10 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10c20 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10c30 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10c40 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
10c50 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
10c60 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
10c70 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
10c80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
10c90 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
10ca0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10cb0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10cc0 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10cd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10ce0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10cf0 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10d00 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10d10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10d30 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10d40 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
10d50 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
10d60 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
10d70 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
10d80 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
10d90 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
10da0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10db0 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10dc0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10dd0 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10de0 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10df0 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10e00 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10e10 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10e20 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10e30 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10e40 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
10e50 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
10e60 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
10e70 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
10e80 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
10e90 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
10ea0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10eb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10ec0 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10ed0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10ef0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10f00 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10f10 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10f20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10f30 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10f40 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
10f50 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
10f60 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10f70 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
10f80 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
10f90 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
10fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10fb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10fc0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10fd0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
10fe0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10ff0 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
11000 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
11010 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
11020 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
11030 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
11040 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
11050 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
11060 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
11070 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
11080 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
11090 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
110a0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
110b0 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
110c0 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
110d0 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
110e0 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
110f0 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
11100 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
11110 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
11120 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
11130 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
11140 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11150 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
11160 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
11170 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
11180 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
11190 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
111a0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
111b0 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
111c0 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
111d0 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
111e0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
111f0 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
11200 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
11210 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
11220 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
11230 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11240 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
11250 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
11260 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
11270 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
11280 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
112b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
112c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
112d0 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
112e0 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
112f0 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
11300 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
11310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11320 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
11330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11340 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
11370 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
11380 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
11390 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
113a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
113b0 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
113c0 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
113d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
113e0 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
113f0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
11400 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
11410 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
11420 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
11430 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
11440 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
11450 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
11460 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
11470 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
11480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11490 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
114a0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
114b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
114c0 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
114d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
114e0 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
114f0 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
11500 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
11510 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
11520 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
11530 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
11540 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
11550 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
11560 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
11570 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
11580 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
11590 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
115a0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
115b0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
115c0 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
115d0 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
115e0 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
115f0 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
11600 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
11610 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
11620 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
11630 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
11640 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
11650 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
11660 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
11670 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
11680 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
11690 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
116a0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
116b0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
116c0 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
116d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
116e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
116f0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
11700 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
11710 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
11720 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
11730 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
11740 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
11750 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
11760 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
11770 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
11780 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
11790 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
117a0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
117b0 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
117c0 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
117d0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
117e0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
117f0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11800 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
11810 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11820 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11830 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11840 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11850 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
11860 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11870 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
11880 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
11890 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
118c0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
118d0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
118e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
118f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11900 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11910 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11920 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11930 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11940 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
11950 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
11960 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
11970 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
11980 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
11990 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
119a0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
119b0 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
119c0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
119d0 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
119e0 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
119f0 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11a00 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11a10 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11a20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11a30 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11a40 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11a50 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
11a60 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11a70 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
11a80 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
11a90 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
11aa0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11ab0 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11ac0 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11ad0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11ae0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11af0 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11b00 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11b10 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11b20 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11b30 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11b40 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
11b50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
11b60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11b70 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
11b80 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
11b90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
11ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11bc0 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11bd0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11be0 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11bf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11c00 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11c10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11c20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11c30 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11c40 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
11c50 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
11c60 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
11c70 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
11c80 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
11c90 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
11ca0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11cb0 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11cc0 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11cd0 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11ce0 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11cf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
11d00 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72  AGER_OPEN );.  r
11d10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44  eturn pPager->iD
11d20 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  ataVersion;.}../
11d30 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11d40 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
11d50 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11d60 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
11d70 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
11d80 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
11d90 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
11da0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11db0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11dc0 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11dd0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11de0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11df0 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11e00 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11e10 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11e20 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11e30 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11e40 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
11e50 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11e60 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
11e70 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
11e80 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
11e90 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11eb0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11ec0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11ed0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11ee0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11ef0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11f00 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   || sqlite3Journ
11f10 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
11f20 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11f30 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11f40 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11f50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11f60 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11f70 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11f80 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11f90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11fa0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11fb0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11fc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11fd0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11fe0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11ff0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
12000 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
12010 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
12020 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
12030 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
12040 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
12050 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
12060 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
12070 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
12080 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
12090 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
120a0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
120b0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
120c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
120e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
120f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
12100 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12110 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
12120 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
12130 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
12140 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
12150 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
12160 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
12170 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
12180 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
12190 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
121a0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
121b0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
121c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
121d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
121e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
121f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12200 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
12210 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
12220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12230 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12240 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
12250 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
12260 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12270 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
12280 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
12290 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
122a0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
122b0 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
122c0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
122d0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
122e0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
122f0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
12300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12310 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
12320 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
12330 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
12340 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
12350 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
12360 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
12370 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
12380 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
12390 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
123a0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
123b0 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
123c0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
123d0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
123e0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
123f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12400 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
12410 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
12420 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
12430 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
12440 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
12450 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
12460 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
12470 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
12480 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
12490 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
124a0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
124b0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
124c0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
124d0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
124e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
124f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
12500 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
12510 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
12520 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
12530 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
12540 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
12550 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12560 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
12570 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
12580 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12590 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
125a0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
125b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
125c0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
125d0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
125e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
125f0 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
12600 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
12610 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
12620 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
12630 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
12640 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
12650 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
12660 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
12670 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
12680 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
12690 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
126a0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
126b0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
126c0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
126d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
126e0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
126f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
12700 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
12710 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
12720 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
12740 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
12750 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
12760 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
12770 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
12780 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
12790 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
127a0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
127b0 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
127c0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
127d0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
127e0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
127f0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
12800 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
12810 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
12820 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
12830 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
12840 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
12850 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
12860 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
12870 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
12880 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
12890 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
128a0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
128b0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
128c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
128d0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
128e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
128f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12900 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12910 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12920 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12930 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12940 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12950 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12960 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
12970 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12980 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12990 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
129a0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
129b0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
129c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
129d0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
129e0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
129f0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12a00 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12a10 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12a20 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12a30 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12a40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12a50 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12a60 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12a70 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12a80 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12a90 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12aa0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12ab0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12ac0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12ad0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12ae0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12af0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12b00 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12b10 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12b20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12b30 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12b40 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12b50 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12b60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12b70 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12b80 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12b90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12ba0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12bb0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12bc0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12bd0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12be0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12bf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12c00 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12c10 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12c20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12c30 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12c40 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12c50 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12c60 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12c70 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12c80 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12c90 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12ca0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12cb0 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12cc0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12ce0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12cf0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12d00 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12d10 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12d20 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12d30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12d40 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12d50 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12d60 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12d70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12d80 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12d90 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12da0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12db0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12dc0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12dd0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12de0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12df0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12e00 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12e10 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12e20 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12e30 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12e40 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12e50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12e60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12e80 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
12e90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12ea0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
12eb0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  ->tempFile==0 ){
12ec0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
12ed0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12ee0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
12ef0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
12f00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12f10 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12f20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12f30 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12f40 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67  e = (isOpen(pPag
12f50 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52  er->jfd) ? PAGER
12f60 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45  _OPEN : PAGER_RE
12f70 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ADER);.    }.   
12f80 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
12f90 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
12fa0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
12fb0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
12fc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12fd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12fe0 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
12ff0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
13000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13010 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
13020 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
13030 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
13040 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Master = 0;.}../
13050 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13060 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
13070 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
13080 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
13090 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
130a0 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
130b0 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
130c0 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
130d0 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
130e0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
130f0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
13100 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
13110 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
13120 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
13130 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
13140 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
13150 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
13160 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
13170 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
13180 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
13190 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
131a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
131b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
131c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
131d0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
131e0 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
131f0 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
13200 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
13210 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
13220 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
13230 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
13240 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
13250 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
13260 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
13270 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
13280 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
13290 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
132a0 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
132b0 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
132c0 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
132d0 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
132e0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
132f0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
13300 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
13310 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
13320 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
13330 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
13340 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
13350 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
13360 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
13370 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
13380 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
13390 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
133a0 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
133b0 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
133c0 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
133d0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
133e0 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
133f0 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
13400 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
13410 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
13430 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
13440 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
13450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13460 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
13470 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
13480 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
13490 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
134a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
134b0 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
134c0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
134d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
134e0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
134f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
13500 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
13510 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
13520 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
13530 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
13540 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
13550 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
13560 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
13570 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
13580 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
13590 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
135a0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
135b0 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  R;.    setGetter
135c0 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
135d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
135e0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
135f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
13600 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
13610 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a  o nPage);../*.**
13620 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e 73   The write trans
13630 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70  action open on p
13640 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20 63  Pager is being c
13650 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69  ommitted (bCommi
13660 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  t==1).** or roll
13670 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74  ed back (bCommit
13680 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ==0)..**.** Retu
13690 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f  rn TRUE if and o
136a0 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79  nly if all dirty
136b0 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65   pages should be
136c0 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
136d0 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a  ..**.** Rules:.*
136e0 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f  *.**   *  For no
136f0 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65 73  n-TEMP databases
13700 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f  , always sync to
13710 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20   disk.  This is 
13720 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20  necessary.**    
13730 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f    for transactio
13740 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65  ns to be durable
13750 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e  ..**.**   *  Syn
13760 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  c TEMP database 
13770 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54  only on a COMMIT
13780 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b   (not a ROLLBACK
13790 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69  ) when the backi
137a0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20  ng.**      file 
137b0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
137c0 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61 20   already (via a 
137d0 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74  spill on pagerSt
137e0 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20  ress()) and.**  
137f0 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d      when the num
13800 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61 67  ber of dirty pag
13810 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63  es in memory exc
13820 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65 20  eeds 25% of the 
13830 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61  total.**      ca
13840 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  che size..*/.sta
13850 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75  tic int pagerFlu
13860 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72  shOnCommit(Pager
13870 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43   *pPager, int bC
13880 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50  ommit){.  if( pP
13890 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
138a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
138b0 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72  if( !bCommit ) r
138c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
138d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
138e0 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
138f0 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
13900 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72  PCachePercentDir
13910 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
13920 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a  he)>=25);.}../*.
13930 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13940 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
13950 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
13960 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
13970 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
13980 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
13990 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
139a0 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
139b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
139c0 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
139d0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
139e0 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
139f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
13a00 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
13a10 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
13a20 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
13a30 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
13a40 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
13a50 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13a60 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
13a70 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13a80 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
13a90 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
13aa0 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
13ab0 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
13ac0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
13ad0 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
13ae0 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
13af0 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
13b00 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
13b10 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
13b20 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13b30 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
13b40 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
13b50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
13b60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13b70 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
13b80 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
13b90 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
13ba0 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
13bb0 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
13bc0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
13bd0 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
13be0 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
13bf0 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
13c00 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
13c10 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
13c20 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
13c30 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
13c40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13c50 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
13c60 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13c70 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
13c80 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13c90 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13ca0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13cb0 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13cc0 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13cd0 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13ce0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13cf0 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
13d00 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13d10 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
13d20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
13d30 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
13d40 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
13d50 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
13d60 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
13d70 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
13d80 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13d90 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13da0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13db0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13dc0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13dd0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13de0 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13df0 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
13e00 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
13e10 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
13e20 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
13e30 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
13e40 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
13e50 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
13e60 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
13e70 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
13e80 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13e90 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13ea0 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13eb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13ec0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13ed0 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13ee0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13ef0 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
13f00 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
13f10 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
13f20 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
13f30 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
13f40 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13f50 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
13f60 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
13f70 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
13f80 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13f90 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13fa0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13fb0 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13fc0 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13fd0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
13fe0 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
13ff0 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
14000 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
14010 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
14020 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
14030 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
14040 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
14050 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
14060 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
14070 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
14080 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
14090 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
140a0 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
140b0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
140c0 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
140d0 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
140e0 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
140f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
14100 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
14110 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
14120 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
14130 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
14140 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
14150 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
14160 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
14170 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
14180 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
14190 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
141a0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
141b0 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
141c0 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
141d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
141e0 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
141f0 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
14200 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
14210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14220 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
14230 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
14240 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
14250 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
14260 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
14270 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
14280 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
14290 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
142a0 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
142b0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
142c0 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
142d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
142e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
142f0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
14300 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14310 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
14320 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
14330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14340 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
14350 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
14360 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
14370 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
14380 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
14390 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
143a0 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
143b0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
143c0 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
143d0 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
143e0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
143f0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
14400 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
14410 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
14420 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
14430 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
14440 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
14450 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
14460 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
14470 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
14480 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
14490 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
144a0 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
144b0 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
144c0 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
144d0 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
144e0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
144f0 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
14500 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
14510 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
14520 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
14530 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
14540 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
14550 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
14560 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
14570 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
14580 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
14590 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
145a0 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
145b0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
145c0 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
145d0 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
145e0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
145f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
14600 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
14610 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14620 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
14630 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
14640 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
14650 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
14660 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
14670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
14680 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
14690 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
146a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
146b0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
146c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
146d0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
146e0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
146f0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
14700 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
14710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14720 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
14730 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
14740 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
14750 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14760 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
14770 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
14780 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69   .      || (sqli
14790 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
147a0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
147b0 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
147c0 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
147d0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ).  );.  if( isO
147e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
147f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14800 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14810 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
14820 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
14830 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
14840 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
14850 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14860 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
14870 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
14880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14890 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
148a0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
148b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
148c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
148d0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
148e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
148f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14900 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14910 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
14920 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14930 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
14940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14950 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
14960 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14970 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
14980 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
14990 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
149a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
149b0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
149c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
149d0 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
149e0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69  file size is wri
149f0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
14a00 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a  ode right away..
14a10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68            ** Oth
14a20 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e  erwise the journ
14a30 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65  al might resurre
14a40 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70  ct following a p
14a50 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20  ower loss and.  
14a60 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
14a70 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61   the last transa
14a80 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61  ction to roll ba
14a90 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20  ck.  See.       
14aa0 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75     ** https://bu
14ab0 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f  gzilla.mozilla.o
14ac0 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f  rg/show_bug.cgi?
14ad0 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20  id=1072773.     
14ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14b00 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
14b10 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
14b20 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ags);.        }.
14b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14b40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14b50 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
14b60 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14b70 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14b80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
14b90 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
14ba0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14bb0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
14bc0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
14bd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
14be0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
14bf0 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
14c00 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
14c10 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65  ster||pPager->te
14c20 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70  mpFile);.      p
14c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c40 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
14c50 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
14c60 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
14c70 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
14c80 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
14c90 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
14ca0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
14cb0 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
14cc0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
14cd0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
14ce0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
14cf0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
14d00 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
14d10 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
14d20 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
14d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14d40 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
14d50 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
14d60 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  mory journal..  
14d70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
14d80 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67   bDelete = !pPag
14d90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
14da0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14db0 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
14dc0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
14dd0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )==0 );.      as
14de0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14df0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14e00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14e10 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14e20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14e30 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14e40 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14e50 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14e60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14e70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14e80 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
14e90 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14ea0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14eb0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
14ec0 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
14ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14ee0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14ef0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
14f00 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
14f10 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20  ->extraSync);.  
14f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14f30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14f40 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14f50 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14f60 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
14f70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
14f80 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
14f90 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14fa0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
14fb0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
14fc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
14fd0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
14fe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
14ff0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
15000 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
15010 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
15020 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
15030 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
15040 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
15050 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
15060 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
15070 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
15080 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
15090 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
150a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
150b0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
150c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
150d0 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67  if( MEMDB || pag
150e0 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28  erFlushOnCommit(
150f0 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29  pPager, bCommit)
15100 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15110 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
15120 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
15130 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15140 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15150 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50  ClearWritable(pP
15160 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
15170 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15180 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
15190 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
151a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
151b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
151c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
151d0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
151e0 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
151f0 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
15200 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
15210 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
15220 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
15230 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
15240 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
15250 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
15260 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
15270 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
15280 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
15290 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
152a0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
152b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
152c0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
152d0 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
152e0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
152f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15300 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
15310 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
15320 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
15330 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
15340 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
15350 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
15360 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
15370 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
15380 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
15390 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
153a0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
153b0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
153c0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
153d0 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
153e0 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
153f0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
15400 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
15410 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
15420 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
15430 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
15440 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
15450 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
15460 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
15470 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
15480 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
15490 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
154a0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
154b0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
154c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
154d0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
154e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
154f0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
15500 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
15510 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
15520 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
15530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
15540 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
15550 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
15560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15570 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
15580 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
15590 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
155a0 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
155b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
155c0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
155d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
155e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
155f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
15600 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
15610 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
15620 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
15630 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
15640 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
15650 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
15660 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
15670 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
15680 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
15690 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
156a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
156b0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
156c0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
156d0 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
156e0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
156f0 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
15700 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
15710 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
15720 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
15730 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
15740 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
15750 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
15760 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
15770 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
15780 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
15790 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
157a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
157b0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
157c0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
157d0 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
157e0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
157f0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
15800 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
15810 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
15820 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
15830 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
15840 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
15850 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
15860 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
15870 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
15880 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
15890 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
158a0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
158b0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
158c0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
158d0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
158e0 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
158f0 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
15900 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
15910 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15920 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
15930 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
15940 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
15950 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
15960 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
15970 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
15980 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
15990 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
159a0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
159b0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
159c0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
159d0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
159e0 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
159f0 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
15a00 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
15a10 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
15a20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
15a30 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
15a40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
15a50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15a60 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
15a70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15a80 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
15a90 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
15aa0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
15ab0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
15ac0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15ad0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15ae0 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15af0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15b00 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15b10 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15b20 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15b30 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15b40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15b50 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15b60 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
15b70 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
15b80 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
15b90 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
15ba0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
15bb0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
15bc0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15be0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15c00 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15c10 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15c20 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15c30 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15c40 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15c50 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15c60 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
15c70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15c80 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
15c90 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15ca0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15cb0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15cc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15cd0 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15ce0 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15cf0 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15d00 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15d10 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15d20 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15d30 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15d40 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15d50 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15d60 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
15d70 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
15d80 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
15d90 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15da0 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15db0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15dc0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15dd0 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15de0 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15df0 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15e00 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15e10 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15e20 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15e30 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15e40 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15e50 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15e60 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
15e70 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
15e80 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15e90 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15ea0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15eb0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15ec0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15ed0 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15ee0 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15ef0 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15f00 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15f10 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15f20 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15f30 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15f40 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15f50 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15f60 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
15f70 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
15f80 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
15f90 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
15fa0 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
15fb0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
15fc0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15fd0 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15fe0 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15ff0 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
16000 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16010 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
16020 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
16030 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
16040 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
16050 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16060 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
16070 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
16080 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
16090 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
160a0 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
160b0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
160c0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
160d0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
160e0 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
160f0 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
16100 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16110 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
16120 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
16130 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
16140 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
16150 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
16160 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
16170 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
16180 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
16190 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
161a0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
161d0 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
161e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
161f0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
16200 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
16210 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
16220 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
16230 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
16240 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
16250 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16260 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16270 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
16280 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
16290 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
162a0 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
162b0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
162c0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
162d0 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
162e0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
162f0 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
16300 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
16310 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
16320 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
16330 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
16340 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
16350 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
16360 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
16370 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
16380 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
16390 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
163a0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
163b0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
163c0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
163d0 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
163e0 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
163f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16400 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
16410 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
16420 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16430 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
16440 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
16450 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
16460 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
16470 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
16480 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
16490 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
164a0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
164b0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
164c0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
164d0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
164e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
164f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16500 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
16510 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
16520 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
16530 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
16540 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16550 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
16560 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
16570 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16580 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
16590 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
165a0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
165b0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
165c0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
165d0 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
165e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
165f0 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
16600 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
16610 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
16620 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
16630 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
16640 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
16650 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
16660 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
16670 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
16680 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
16690 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
166a0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
166b0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
166c0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
166d0 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
166e0 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
166f0 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
16700 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
16710 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
16720 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
16730 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
16740 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
16750 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16760 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
16770 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
16780 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
16790 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
167a0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
167b0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
167c0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
167d0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
167e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
167f0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
16800 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16810 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
16820 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
16830 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
16840 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
16850 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
16860 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16870 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
16880 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
16890 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
168a0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
168b0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
168c0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
168d0 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
168e0 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
168f0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
16900 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
16910 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
16920 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
16930 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
16940 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
16950 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
16960 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
16970 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
16980 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
16990 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
169a0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
169b0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
169c0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
169d0 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
169e0 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
169f0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16a00 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
16a10 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
16a20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16a30 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
16a40 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
16a50 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
16a60 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
16a70 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16a80 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
16a90 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
16aa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
16ab0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
16ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16ad0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16ae0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16af0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16b00 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16b10 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16b20 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16b30 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16b40 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16b50 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16b60 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
16b70 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
16b80 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
16b90 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
16ba0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
16bb0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
16bc0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16bd0 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16be0 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16bf0 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16c00 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16c20 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16c30 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16c40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16c50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c70 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
16c80 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
16c90 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
16cc0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16cd0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16ce0 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16d00 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16d10 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16d20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16d30 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16d40 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16d50 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16d60 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
16d70 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
16d80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16d90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16da0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
16db0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
16dc0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16de0 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16df0 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66  is synced */.#if
16e00 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16e10 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72  ODEC.  /* The jr
16e20 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72  nlEnc flag is tr
16e30 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61  ue if Journal pa
16e40 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61  ges should be pa
16e50 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  ssed through.  *
16e60 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74  * the codec.  It
16e70 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75   is false for pu
16e80 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  re in-memory jou
16e90 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73  rnals. */.  cons
16ea0 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20  t int jrnlEnc = 
16eb0 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70  (isMainJrnl || p
16ec0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
16ed0 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a  ory==0);.#endif.
16ee0 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
16ef0 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
16f00 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
16f10 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
16f20 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
16f30 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
16f40 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
16f50 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
16f60 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
16f70 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
16f80 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
16f90 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
16fa0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
16fb0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
16fc0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
16fd0 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
16fe0 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
16ff0 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
17000 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
17010 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
17020 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
17030 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
17040 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
17050 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
17060 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
17070 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
17080 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
17090 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
170a0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
170b0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
170c0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
170d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
170e0 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
170f0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
17100 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
17110 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
17120 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
17130 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
17140 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17150 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
17160 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
17170 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
17180 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
17190 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
171a0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
171b0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
171c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
171d0 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
171e0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
171f0 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
17200 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
17210 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17220 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17230 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
17240 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
17250 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
17260 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
17270 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
17280 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
17290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
172a0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
172b0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
172c0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
172d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
172e0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
172f0 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
17300 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
17310 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
17320 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
17330 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
17340 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
17350 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
17360 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
17370 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
17380 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
17390 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
173a0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
173b0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
173c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
173d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
173e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
173f0 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
17400 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17410 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
17420 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17430 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17440 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
17450 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
17460 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
17470 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
17480 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
17490 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
174a0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
174b0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
174c0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
174d0 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
174e0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
174f0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
17500 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
17510 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
17520 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
17530 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
17540 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
17550 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
17560 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
17570 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
17580 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
17590 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
175a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
175b0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
175c0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
175d0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
175e0 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
175f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17600 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
17610 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
17620 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
17630 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
17640 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
17650 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17670 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
17680 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
17690 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
176a0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
176b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
176c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
176d0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
176e0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
176f0 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
17700 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
17710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17720 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
17730 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
17740 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17750 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66   played back bef
17760 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
17770 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
17780 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
17790 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
177a0 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
177b0 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
177c0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
177d0 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
177e0 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
177f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17800 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
17810 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
17820 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
17830 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
17840 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
17850 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
17860 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
17870 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
17880 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
17890 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
178a0 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
178b0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
178c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
178d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
178e0 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
178f0 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
17900 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
17910 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
17920 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17930 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
17940 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
17950 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
17960 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
17970 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
17980 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
17990 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
179a0 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
179b0 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
179c0 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
179d0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
179e0 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
179f0 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
17a00 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
17a10 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
17a20 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
17a30 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
17a40 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
17a50 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
17a60 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
17a70 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
17a80 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
17a90 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
17aa0 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
17ab0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
17ac0 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
17ad0 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
17ae0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
17af0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
17b00 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
17b10 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
17b20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
17b30 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
17b40 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
17b50 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
17b60 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
17b70 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
17b80 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
17b90 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
17ba0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
17bb0 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
17bc0 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
17bd0 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
17be0 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
17bf0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
17c00 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
17c10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
17c20 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
17c30 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
17c40 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
17c50 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17c60 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
17c70 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
17c80 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
17c90 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
17ca0 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
17cb0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
17cc0 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
17cd0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
17ce0 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
17cf0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17d00 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
17d10 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
17d20 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
17d30 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
17d40 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
17d50 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
17d60 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
17d70 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
17d80 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
17d90 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
17da0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
17db0 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
17dc0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
17dd0 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
17de0 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
17df0 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
17e00 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17e10 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
17e20 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
17e30 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
17e40 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
17e50 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
17e60 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
17e70 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
17e80 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17e90 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
17ea0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
17eb0 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
17ec0 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
17ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
17ee0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
17ef0 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
17f00 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
17f10 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
17f20 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
17f30 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
17f40 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
17f50 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
17f60 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
17f70 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
17f80 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
17f90 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
17fa0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
17fb0 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
17fc0 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
17fd0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
17fe0 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
17ff0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
18000 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
18010 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
18020 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
18030 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
18040 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
18050 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
18060 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
18070 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
18080 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
18090 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
180a0 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
180b0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
180c0 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
180d0 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
180e0 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
180f0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
18100 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
18110 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
18120 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
18130 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
18140 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18150 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
18160 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
18170 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18180 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
18190 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20  EN || pPg==0 || 
181a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
181b0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
181c0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
181d0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
181e0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
181f0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
18200 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
18210 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
18220 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
18230 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
18240 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
18250 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
18260 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
18270 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
18280 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
18290 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
182a0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
182b0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
182c0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
182d0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
182e0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
182f0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
18300 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
18310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
18320 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
18330 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
18340 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
18350 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
18360 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
18370 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
18380 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
18390 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
183a0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
183b0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
183c0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
183d0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
183e0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
183f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
18400 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18410 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
18420 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
18430 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20 72  Write the data r
18440 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
18450 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74  rnal back into t
18460 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18470 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
18480 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76   usually safe ev
18490 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70  en for an encryp
184a0 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20 61  ted database - a
184b0 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  s the data.    *
184c0 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64 20  * was encrypted 
184d0 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77 72  before it was wr
184e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
184f0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65  rnal file. The e
18500 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  xception.    ** 
18510 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20 77  is if the data w
18520 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  as just read fro
18530 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  m an in-memory s
18540 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74  ub-journal. In t
18550 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  hat.    ** case 
18560 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79  it must be encry
18570 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  pted here before
18580 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
18590 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
185a0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f      ** file.  */
185b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
185c0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28  AS_CODEC.    if(
185d0 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20   !jrnlEnc ){.   
185e0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
185f0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
18600 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18610 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a  M_BKPT, aData);.
18620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18630 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
18640 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
18650 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
18660 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
18670 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
18680 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
18690 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
186a0 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73  _BKPT);.    }els
186b0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  e.#endif.    rc 
186c0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
186d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
186e0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
186f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18700 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  );..    if( pgno
18710 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
18720 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
18730 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
18740 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
18750 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
18760 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20  ackup ){.#ifdef 
18770 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18780 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45  .      if( jrnlE
18790 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f  nc ){.        CO
187a0 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
187b0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
187c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
187d0 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
187e0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
187f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
18800 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
18810 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  a);.        CODE
18820 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
18830 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
18840 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
18850 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65  aData);.      }e
18860 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
18870 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
18880 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
18890 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
188a0 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  )aData);.    }. 
188b0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
188c0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
188d0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
188e0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
188f0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
18900 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
18910 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
18920 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18930 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
18940 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
18950 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
18960 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
18970 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
18980 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
18990 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
189a0 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
189b0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
189c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
189d0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
189e0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
189f0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
18a00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18a10 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
18a20 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
18a30 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
18a40 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
18a50 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
18a60 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
18a70 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
18a80 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
18a90 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
18aa0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
18ab0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
18ac0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
18ad0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18ae0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
18af0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
18b00 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
18b10 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
18b20 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
18b30 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
18b40 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
18b50 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
18b60 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
18b70 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
18b80 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
18b90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
18ba0 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
18bb0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
18bc0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
18bd0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
18be0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
18bf0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
18c00 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
18c10 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
18c20 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
18c30 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18c40 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
18c50 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
18c60 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
18c70 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18c80 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30  LAG_ROLLBACK)==0
18c90 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18ca0 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
18cb0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18cc0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18cd0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
18ce0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
18cf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18d00 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18d10 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
18d20 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20  OLLBACK)!=0 );. 
18d30 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
18d40 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
18d50 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
18d60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18d70 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18d80 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18d90 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
18da0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
18db0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
18dc0 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
18dd0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
18de0 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
18df0 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
18e00 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
18e10 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
18e20 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
18e30 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
18e40 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
18e50 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
18e60 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
18e70 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
18e80 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
18e90 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
18ea0 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
18eb0 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
18ec0 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
18ed0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
18ee0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
18ef0 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
18f00 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
18f10 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
18f20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
18f30 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
18f40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18f50 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
18f60 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
18f70 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  /* It used to be
18f80 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61   that sqlite3Pca
18f90 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
18fa0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72  ) was called her
18fb0 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74  e.  But.    ** t
18fc0 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e  hat call was dan
18fd0 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e  gerous and had n
18fe0 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e  o detectable ben
18ff0 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63  efit since the c
19000 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  ache.    ** is n
19010 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20  ormally cleaned 
19020 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
19030 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72  CleanAll() after
19040 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f   rollback and so
19050 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
19060 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20   removed. */.   
19070 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
19080 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
19090 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
190a0 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
190b0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
190c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
190d0 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
190e0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
190f0 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
19100 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
19110 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19120 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
19130 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
19140 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19150 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19160 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
19170 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
19180 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
19190 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  /.#if SQLITE_HAS
191a0 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a  _CODEC.    if( j
191b0 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31  rnlEnc ){ CODEC1
191c0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
191d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
191e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
191f0 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  PT); }.#endif.  
19200 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19210 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
19220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19230 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
19240 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
19250 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
19260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
19270 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
19280 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
19290 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
192a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
192b0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
192c0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
192d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
192e0 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
192f0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
19300 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19310 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
19320 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
19330 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
19340 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
19350 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
19360 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
19370 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
19380 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
19390 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
193a0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
193b0 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
193c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
193d0 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
193e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
193f0 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
19400 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
19410 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
19420 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
19430 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
19440 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
19450 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
19460 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
19470 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
19480 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
19490 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
194a0 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
194b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
194c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
194d0 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
194e0 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
194f0 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
19500 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
19510 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
19520 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
19530 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
19540 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
19550 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
19560 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
19570 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
19580 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
19590 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
195a0 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
195b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
195c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
195d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
195e0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
195f0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
19600 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
19610 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
19620 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19630 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
19640 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
19650 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
19660 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
19670 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
19680 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
19690 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
196a0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
196b0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
196c0 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
196d0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
196e0 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
196f0 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
19700 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
19710 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
19720 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
19730 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
19740 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19750 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
19760 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
19770 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
19780 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
19790 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
197a0 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
197b0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
197c0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
197d0 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
197e0 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
197f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
19800 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
19810 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
19820 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
19830 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
19840 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
19850 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
19860 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
19870 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
19880 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
19890 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
198a0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
198b0 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
198c0 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
198d0 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
198e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
198f0 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
19900 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
19910 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
19920 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
19930 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
19940 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
19950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19960 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
19970 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
19980 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
19990 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
199a0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
199b0 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
199c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
199d0 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
199e0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
199f0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
19a00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19a10 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19a20 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19a50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
19a60 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
19a70 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
19a80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19a90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
19aa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
19ab0 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
19ac0 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
19ad0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
19ae0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
19af0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
19b00 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
19b10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19b20 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
19b30 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
19b40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
19b50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19b60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
19b70 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
19b80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19b90 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
19ba0 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
19bb0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
19bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
19bd0 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
19be0 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
19bf0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
19c00 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
19c10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
19c20 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
19c30 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
19c40 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
19c50 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
19c60 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
19c70 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
19c80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
19c90 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
19ca0 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
19cb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19cc0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
19cd0 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
19ce0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
19cf0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
19d00 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
19d10 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
19d20 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
19d30 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
19d40 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
19d50 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
19d60 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
19d70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19d80 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
19d90 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
19da0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
19db0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19dc0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
19dd0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
19de0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19df0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
19e00 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
19e10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
19e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19e30 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19e40 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
19e50 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
19e60 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
19e70 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
19e80 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
19e90 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
19ea0 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
19eb0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
19ec0 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
19ed0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
19ee0 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
19ef0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
19f00 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
19f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
19f20 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
19f30 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
19f40 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
19f50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19f60 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
19f70 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
19f80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19f90 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19fa0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
19fb0 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
19fc0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
19fd0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
19fe0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
19ff0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
1a000 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
1a010 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
1a020 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
1a030 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a040 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
1a050 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a060 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20   }.  zMasterPtr 
1a070 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
1a080 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
1a090 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
1a0a0 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
1a0b0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
1a0c0 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
1a0d0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66  ournal, 0);.  if
1a0e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a0f0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
1a100 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  _out;.  zMasterJ
1a110 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
1a120 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a  urnal] = 0;..  z
1a130 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
1a140 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c  rJournal;.  whil
1a150 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
1a160 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
1a170 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a180 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
1a190 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a1a0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
1a1b0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
1a1c0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
1a1d0 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20  xists);.    if( 
1a1e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a1f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
1a200 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
1a210 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20  .    if( exists 
1a220 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ){.      /* One 
1a230 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
1a240 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
1a250 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a260 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a   exists..      *
1a270 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
1a280 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
1a290 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
1a2a0 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
1a2b0 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
1a2c0 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
1a2d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a2e0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
1a2f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  /.      int c;. 
1a300 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1a310 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1a320 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
1a330 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
1a340 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a350 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1a360 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
1a370 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
1a380 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a3a0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a3b0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a3c0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
1a3d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
1a3e0 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
1a3f0 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
1a400 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1a410 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
1a420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a440 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a450 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a460 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
1a470 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
1a480 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
1a490 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
1a4a0 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
1a4b0 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1a4c0 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
1a4d0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1a4e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1a4f0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
1a500 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a520 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
1a530 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
1a540 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
1a550 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
1a560 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
1a570 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1a580 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
1a590 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
1a5a0 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a5b0 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
1a5c0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
1a5d0 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
1a5e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a5f0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1a600 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
1a610 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
1a620 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
1a630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1a650 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1a660 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
1a670 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1a680 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
1a690 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1a6a0 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
1a6b0 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1a6c0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
1a6d0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
1a6e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
1a6f0 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
1a700 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
1a710 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
1a720 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1a730 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1a740 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1a750 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
1a760 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
1a770 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
1a780 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
1a790 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a7a0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
1a7b0 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
1a7c0 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
1a7d0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
1a7e0 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
1a7f0 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
1a800 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
1a810 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
1a820 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
1a830 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
1a840 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
1a850 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
1a860 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
1a870 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
1a880 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
1a890 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
1a8a0 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
1a8b0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
1a8c0 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
1a8d0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1a8e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
1a8f0 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
1a900 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
1a910 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
1a920 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
1a930 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
1a940 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
1a950 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
1a960 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
1a970 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
1a980 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
1a990 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
1a9a0 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
1a9b0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1a9c0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
1a9d0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1a9e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1a9f0 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
1aa00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa10 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
1aa20 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
1aa30 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1aa40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
1aa50 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
1aa60 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1aa70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1aa80 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1aa90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1aaa0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1aab0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1aac0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1aad0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
1aae0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1aaf0 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
1ab00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1ab10 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1ab20 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1ab30 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1ab40 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1ab50 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1ab60 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1ab70 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1ab80 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1ab90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1aba0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1abb0 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1abc0 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1abd0 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1abe0 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1abf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ac00 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1ac10 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1ac20 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1ac30 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1ac40 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1ac50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1ac60 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1ac70 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1ac80 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1ac90 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1aca0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1acb0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1acc0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1acd0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1ace0 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1acf0 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1ad00 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1ad10 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ad20 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1ad30 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1ad40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1ad50 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1ad60 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1ad70 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1ad80 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1ad90 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1ada0 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1adb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1adc0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1add0 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1ade0 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1adf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1ae00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ae10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ae20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1ae30 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1ae40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ae50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ae60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1ae70 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1ae80 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1ae90 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1aea0 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1aeb0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1aec0 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1aed0 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1aee0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1aef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1af00 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1af10 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1af20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1af30 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1af40 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1af50 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1af60 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1af70 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1af80 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1af90 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1afa0 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1afb0 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1afc0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1afd0 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1afe0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1aff0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1b000 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1b010 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1b020 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1b030 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1b040 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1b050 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1b060 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1b070 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b080 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1b090 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1b0a0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1b0b0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1b0c0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1b0d0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1b0e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b0f0 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1b100 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1b110 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1b120 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b130 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b140 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1b150 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1b160 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b170 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1b180 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1b190 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b1a0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1b1b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b1c0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1b1d0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1b1e0 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1b1f0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1b200 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1b210 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1b220 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1b230 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b240 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1b250 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b260 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1b270 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1b280 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1b290 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1b2a0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1b2b0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1b2c0 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1b2d0 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1b2e0 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1b2f0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1b300 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1b310 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1b320 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1b330 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1b340 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1b350 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1b360 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1b370 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1b380 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1b390 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1b3a0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1b3b0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1b3c0 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1b3d0 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1b3e0 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1b3f0 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1b400 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1b410 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1b420 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1b430 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1b440 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1b450 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1b460 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b470 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1b480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b490 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1b4a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b4b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b4c0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1b4d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1b4e0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b4f0 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1b500 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1b510 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b520 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b540 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b550 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1b560 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b570 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1b580 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1b590 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1b5a0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1b5b0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1b5c0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1b5d0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1b5e0 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1b5f0 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1b600 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1b610 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1b620 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1b630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1b640 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b650 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1b660 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1b670 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1b680 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1b690 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1b6a0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1b6b0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1b6c0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1b6d0 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1b6e0 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1b6f0 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1b700 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b710 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1b720 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1b730 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1b740 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1b750 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1b760 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b770 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b780 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1b790 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1b7a0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1b7b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b7c0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1b7d0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b7e0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b7f0 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1b800 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1b810 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1b820 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1b830 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b840 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b850 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1b860 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1b870 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1b880 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1b890 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1b8a0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1b8b0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1b8c0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1b8d0 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1b8e0 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1b8f0 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1b900 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1b910 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b920 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1b930 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1b940 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1b950 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1b960 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1b970 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b980 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1b990 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1b9a0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1b9b0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1b9c0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1b9d0 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1b9e0 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1b9f0 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1ba00 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1ba10 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1ba20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1ba30 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1ba40 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1ba50 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1ba60 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1ba70 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1ba80 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1ba90 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1baa0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1bab0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1bac0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1bad0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1bae0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1baf0 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1bb00 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1bb10 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1bb20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1bb30 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1bb40 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1bb50 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1bb60 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1bb70 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1bb80 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1bb90 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1bba0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1bbb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bbc0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1bbd0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1bbe0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1bbf0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bc00 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1bc10 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1bc20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1bc30 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bc40 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1bc50 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1bc60 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1bc70 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1bc80 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1bc90 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1bca0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1bcb0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bcc0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1bcd0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1bce0 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1bcf0 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1bd00 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1bd10 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1bd20 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1bd30 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1bd40 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1bd50 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1bd60 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1bd70 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1bd80 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1bd90 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1bda0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1bdb0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1bdc0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1bdd0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1bde0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1bdf0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1be00 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1be10 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1be20 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1be30 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1be40 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1be50 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1be60 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1be70 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1be80 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1be90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1bea0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1beb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1bec0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1bed0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1bee0 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1bef0 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1bf00 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1bf10 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1bf20 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1bf30 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1bf40 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1bf50 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1bf60 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1bf70 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1bf80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1bf90 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1bfa0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1bfb0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1bfc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1bfd0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1bfe0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1bff0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1c000 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1c010 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c020 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1c030 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1c040 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1c050 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1c060 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1c070 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1c080 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1c090 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1c0a0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1c0b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1c0c0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1c0d0 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1c0e0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1c0f0 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1c100 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1c110 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1c120 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1c130 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1c140 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1c150 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1c160 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1c170 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1c180 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1c190 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1c1a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c1b0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1c1c0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1c1d0 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1c1e0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1c1f0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1c200 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1c210 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c230 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1c240 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1c250 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c260 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1c270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c280 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1c290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c2a0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1c2b0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1c2c0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1c2d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c2e0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1c2f0 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1c300 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c310 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c320 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1c330 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1c340 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1c350 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1c360 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1c370 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1c380 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1c390 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1c3a0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1c3b0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1c3c0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1c3d0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1c3e0 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1c3f0 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1c400 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1c410 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1c420 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1c430 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1c440 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1c450 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
1c460 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53 69   u32 savedPageSi
1c470 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
1c480 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  eSize;..  /* Fig
1c490 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1c4a0 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1c4b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1c4c0 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1c4d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1c4e0 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1c4f0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c500 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1c510 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c520 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1c530 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1c540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c550 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1c560 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1c570 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1c580 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1c590 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c5a0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1c5b0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1c5c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c5d0 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1c5e0 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1c5f0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1c600 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1c610 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1c620 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1c630 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1c640 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1c650 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1c660 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1c670 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1c680 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1c690 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1c6a0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1c6b0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1c6c0 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1c6d0 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1c6e0 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1c6f0 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1c700 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1c710 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c720 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1c730 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e  .c,.  ** mxPathn
1c740 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1c750 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1c760 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1c770 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1c780 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1c790 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1c7a0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c7b0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1c7c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1c7d0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1c7e0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1c7f0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1c800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c810 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1c820 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1c830 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1c840 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1c850 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1c860 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1c870 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1c880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c890 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1c8a0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c8b0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1c8c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1c8d0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1c8e0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1c8f0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1c900 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1c910 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1c920 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1c930 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c940 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1c950 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c960 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1c970 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1c980 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1c990 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1c9a0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1c9b0 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1c9c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1c9d0 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1c9e0 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1c9f0 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1ca00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1ca10 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1ca20 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1ca30 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1ca40 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1ca50 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1ca60 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1ca70 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1ca80 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1ca90 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1caa0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1cab0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1cac0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1cad0 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1cae0 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1caf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cb00 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1cb10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1cb20 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1cb30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1cb40 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1cb50 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1cb60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1cb70 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1cb80 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1cb90 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1cba0 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1cbb0 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1cbc0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1cbd0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1cbe0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1cbf0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1cc00 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1cc10 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1cc20 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1cc30 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1cc40 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1cc50 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1cc60 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1cc70 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1cc80 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1cc90 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1cca0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1ccb0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1ccc0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1ccd0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1cce0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1ccf0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1cd00 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1cd10 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1cd20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1cd30 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1cd40 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1cd50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1cd60 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1cd70 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1cd80 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1cd90 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1cda0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1cdb0 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1cdc0 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1cdd0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1cde0 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1cdf0 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1ce00 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1ce10 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1ce20 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1ce30 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1ce40 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1ce50 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1ce60 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1ce70 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1ce80 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1ce90 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1cea0 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1ceb0 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1cec0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1ced0 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1cee0 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1cef0 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1cf00 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1cf10 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1cf20 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1cf30 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1cf40 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1cf50 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1cf60 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1cf70 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1cf80 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1cf90 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1cfa0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1cfb0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1cfc0 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1cfd0 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1cfe0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1cff0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1d000 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1d010 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1d020 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1d030 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1d040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1d050 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1d060 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1d070 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1d080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d090 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1d0a0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1d0b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1d0c0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1d0d0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1d0e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1d0f0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1d100 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1d110 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1d120 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1d130 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1d140 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1d150 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1d160 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1d170 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1d180 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1d190 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1d1a0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1d1b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d1c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d1d0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1d1e0 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1d1f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d210 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d220 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1d230 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d240 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1d250 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1d260 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1d270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1d280 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1d290 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1d2a0 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1d2b0 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1d2c0 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1d2d0 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1d2e0 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1d2f0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1d300 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d310 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1d320 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1d330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1d340 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1d350 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1d360 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1d370 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1d380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d3a0 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1d3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d3c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d3d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1d3e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d3f0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1d400 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d410 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d420 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d430 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d440 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1d450 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1d460 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1d470 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1d480 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1d490 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1d4a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1d4b0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1d4c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1d4d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1d4e0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1d4f0 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1d500 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1d510 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1d520 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1d530 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1d540 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1d550 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1d560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1d570 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1d580 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1d590 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1d5a0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1d5b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d5c0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1d5d0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d5e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1d600 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1d610 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1d620 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1d630 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1d640 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1d650 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1d660 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1d670 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1d680 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1d690 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1d6a0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1d6b0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1d6c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1d6d0 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1d6e0 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1d6f0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1d700 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1d710 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d720 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d730 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1d740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d750 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1d760 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1d770 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1d780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d790 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1d7a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1d7b0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1d7c0 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d  savedPageSize, -
1d7d0 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c  1);.  }.  /* Fol
1d7e0 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1d7f0 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1d800 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1d810 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1d820 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1d830 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1d840 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1d850 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1d860 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1d870 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d880 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1d890 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1d8a0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1d8b0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1d8c0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1d8d0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1d8e0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d8f0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1d900 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1d910 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1d920 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1d930 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1d940 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1d950 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1d960 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1d970 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1d980 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1d990 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1d9a0 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1d9b0 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1d9c0 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1d9d0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1d9e0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1d9f0 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1da00 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1da10 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1da20 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1da30 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1da40 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1da50 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1da60 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1da70 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1da80 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1da90 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1daa0 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1dab0 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1dac0 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1dad0 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1dae0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1daf0 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1db00 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1db10 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1db20 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1db30 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1db40 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1db50 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1db60 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1db70 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1db80 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1db90 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1dba0 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1dbb0 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1dbc0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1dbd0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1dbe0 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1dbf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dc00 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1dc10 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1dc20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1dc30 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1dc40 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1dc50 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1dc60 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1dc70 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1dc80 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1dc90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dca0 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1dcb0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1dcc0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1dcd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1dce0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1dcf0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1dd00 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1dd10 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1dd20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dd30 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1dd40 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1dd50 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1dd60 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1dd70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1dd80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1dd90 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1dda0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1ddb0 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1ddc0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1ddd0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1dde0 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1ddf0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1de00 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1de10 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1de20 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1de30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1de40 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1de50 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1de60 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1de70 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1de80 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1de90 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1dea0 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1deb0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1dec0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1ded0 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1dee0 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1def0 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1df00 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1df10 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1df20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1df30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1df40 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1df50 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1df60 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1df70 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1df80 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1df90 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1dfa0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1dfb0 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1dfc0 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1dfd0 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1dfe0 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1dff0 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1e000 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1e010 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1e020 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1e030 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1e040 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1e050 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1e060 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20  tabase file (or 
1e070 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41  out of.** the WA
1e080 4c 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65  L if that is whe
1e090 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  re the most rece
1e0a0 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64  nt copy if found
1e0b0 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  ) into .** pPg->
1e0c0 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1e0d0 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1e0e0 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1e0f0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1e100 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1e110 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e120 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1e130 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1e140 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1e150 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1e160 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1e170 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1e180 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e190 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1e1a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1e1b0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1e1c0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e1d0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1e1e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1e1f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e200 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e210 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1e220 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1e230 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e240 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1e250 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1e260 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1e270 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  pPg */.  int rc 
1e280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1e290 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e2a0 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  code */..#ifndef
1e2b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e2c0 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20  .  u32 iFrame = 
1e2d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e2e0 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57 41 4c 20  /* Frame of WAL 
1e2f0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20  containing pgno 
1e300 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1e310 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1e320 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d  GER_READER && !M
1e330 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1e340 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1e350 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  >fd) );..  if( p
1e360 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1e370 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  r) ){.    rc = s
1e380 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e390 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e3a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e3b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e3c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e3d0 7d 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29  }.  if( iFrame )
1e3e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e3f0 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1e400 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1e410 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61 67 65  ame,pPager->page
1e420 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74 61 29  Size,pPg->pData)
1e430 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1e440 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1e450 66 73 65 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e  fset = (pPg->pgn
1e460 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1e470 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1e480 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1e490 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1e4a0 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65  Pg->pData, pPage
1e4b0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
1e4c0 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1e4d0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1e4e0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1e4f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e500 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1e510 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
1e520 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1e530 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1e540 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1e550 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1e560 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1e570 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1e580 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1e590 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1e5a0 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1e5b0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1e5c0 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1e5d0 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1e5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1e5f0 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1e600 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1e610 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1e620 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e630 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1e640 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1e650 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1e660 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1e670 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1e680 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1e690 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1e6a0 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1e6b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1e6c0 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1e6d0 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1e6e0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1e6f0 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1e700 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1e710 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1e720 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1e730 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1e740 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1e750 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1e760 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1e770 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1e780 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1e790 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ise equaling 16 
1e7a0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1e7b0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1e7c0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1e7d0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1e7e0 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1e7f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1e800 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1e810 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1e820 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1e830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e840 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1e850 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1e860 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1e870 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1e880 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1e890 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1e8a0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1e8b0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1e8c0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1e8d0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1e8e0 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20  Pg->pgno, 3, rc 
1e8f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1e900 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1e910 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1e920 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1e930 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1e940 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1e950 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1e960 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1e970 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1e980 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1e990 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1e9a0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1e9c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1e9d0 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
1e9e0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1e9f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ea00 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1ea10 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1ea20 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1ea30 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1ea40 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1ea50 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1ea60 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1ea70 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1ea80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1ea90 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1eaa0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1eab0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1eac0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1ead0 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1eae0 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1eaf0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1eb00 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1eb10 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1eb20 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1eb30 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1eb40 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1eb50 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1eb60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1eb70 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1eb80 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1eb90 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1eba0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1ebb0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1ebc0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1ebd0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1ebe0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1ebf0 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1ec00 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1ec10 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1ec20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ec30 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1ec40 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1ec50 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1ec60 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1ec70 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1ec80 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1ec90 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1eca0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1ecb0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1ecc0 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1ecd0 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1ece0 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1ecf0 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1ed00 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1ed10 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1ed20 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1ed30 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1ed40 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1ed50 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1ed60 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1ed70 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1ed80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ed90 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1eda0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1edb0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1edc0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1edd0 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1ede0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1edf0 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1ee00 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ee10 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1ee20 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1ee30 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1ee40 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1ee50 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1ee60 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1ee70 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1ee80 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1ee90 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1eea0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1eeb0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1eec0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1eed0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1eee0 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1eef0 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1ef00 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1ef10 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1ef20 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1ef30 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1ef40 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1ef50 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1ef60 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1ef70 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1ef80 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1ef90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1efa0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1efb0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1efc0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1efd0 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1efe0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1eff0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1f000 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1f010 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1f020 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f040 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1f050 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1f060 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1f070 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f080 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1f090 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1f0a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1f0b0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1f0c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1f0d0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1f0e0 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1f0f0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1f100 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1f110 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f120 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1f130 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1f160 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1f170 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1f180 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1f190 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1f1a0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1f1b0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1f1c0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1f1d0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1f1e0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1f1f0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1f200 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1f210 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1f220 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1f230 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1f240 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1f250 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1f260 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1f270 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1f280 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1f290 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1f2a0 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1f2b0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1f2c0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1f2d0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1f2e0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f2f0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1f300 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1f310 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1f320 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1f330 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1f340 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1f350 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1f360 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1f370 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1f380 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1f390 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1f3a0 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1f3b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f3c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f3d0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1f3e0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1f3f0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1f400 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1f410 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1f420 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1f430 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f460 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1f470 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1f480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1f490 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1f4a0 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1f4b0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1f4c0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1f4d0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1f4e0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1f4f0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1f500 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1f510 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1f520 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1f530 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1f540 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1f550 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1f560 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1f570 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1f580 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1f590 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1f5a0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1f5b0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1f5c0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1f5d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1f5e0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1f5f0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1f600 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1f610 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1f620 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1f630 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1f640 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f650 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f660 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f670 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1f680 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f690 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1f6a0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1f6b0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1f6c0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f6d0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1f6e0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1f6f0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1f700 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f720 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1f730 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1f740 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1f750 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1f760 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1f770 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1f780 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1f790 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1f7a0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1f7b0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1f7c0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1f7d0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1f7e0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1f7f0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1f800 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1f810 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f820 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1f830 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1f840 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1f850 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1f860 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1f870 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1f880 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1f890 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1f8a0 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1f8b0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1f8c0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1f8d0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1f8e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1f8f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1f900 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f920 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1f930 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1f940 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1f950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1f960 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1f970 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1f980 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f9b0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1f9c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f9f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1fa00 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1fa10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fa20 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1fa30 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1fa40 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1fa60 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1fa70 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1fa80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1fa90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1faa0 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1fab0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1fac0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1fad0 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1fae0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1faf0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1fb00 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1fb10 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1fb20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1fb30 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1fb40 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1fb50 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1fb60 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1fb70 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1fb80 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1fb90 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1fba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1fbb0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1fbc0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1fbd0 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1fbe0 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1fbf0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1fc00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1fc10 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1fc20 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1fc30 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1fc40 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1fc50 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1fc60 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1fc70 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1fc80 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1fc90 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1fca0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1fcb0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1fcc0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1fcd0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1fce0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1fcf0 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1fd00 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1fd10 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1fd20 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1fd30 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1fd40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1fd50 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1fd60 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1fd70 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1fd80 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1fd90 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1fda0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1fdb0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1fdc0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1fdd0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1fde0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1fdf0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1fe00 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1fe10 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1fe20 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1fe30 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1fe40 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1fe50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fe60 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1fe70 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1fe80 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1fe90 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fea0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1feb0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1fec0 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1fed0 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1fee0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1fef0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1ff00 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1ff10 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1ff20 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1ff30 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1ff40 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1ff50 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1ff60 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1ff70 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1ff80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ff90 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1ffa0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ffb0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1ffc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ffd0 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1ffe0 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1fff0 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
20000 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
20010 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
20020 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
20030 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
20040 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
20050 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
20060 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
20070 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
20080 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
20090 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
200a0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
200b0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
200c0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
200d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
200e0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
200f0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
20100 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20130 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
20140 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
20150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20160 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
20170 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
20180 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
20190 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
201a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
201b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
201c0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
201d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
201e0 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
201f0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20200 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
20210 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
20220 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
20230 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
20240 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
20250 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
20260 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
20270 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
20280 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
20290 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
202a0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
202b0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
202c0 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
202d0 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
202e0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
202f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20300 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
20310 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
20320 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
20330 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
20340 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
20350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20360 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
20370 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
20380 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
20390 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
203a0 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
203b0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
203c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
203d0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
203e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
203f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20400 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
20410 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
20420 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
20430 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
20440 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
20450 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20460 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
20470 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
20480 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
20490 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
204a0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
204b0 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
204c0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
204d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
204e0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
204f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20500 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
20510 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
20520 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
20530 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
20540 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
20550 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
20560 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
20570 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
20580 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
20590 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
205a0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
205b0 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
205c0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
205d0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
205e0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
205f0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
20600 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
20610 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
20620 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
20630 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
20640 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
20650 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
20660 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
20670 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
20680 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
20690 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
206a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
206b0 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
206c0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
206d0 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
206e0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
206f0 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
20700 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
20710 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
20720 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
20730 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
20740 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
20750 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20760 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20770 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
20780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20790 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
207a0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
207b0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
207c0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
207d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
207e0 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20  e==0 );.  nPage 
207f0 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
20800 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
20810 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
20820 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20830 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20840 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
20850 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41  from the.  ** WA
20860 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65  L sub-system, de
20870 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65  termine the page
20880 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e 20   count based on 
20890 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
208a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
208b0 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
208c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
208d0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
208e0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
208f0 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
20900 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
20910 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
20920 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
20930 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65   && ALWAYS(isOpe
20940 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
20950 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
20980 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
20990 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
209a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
209b0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
209c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
209d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
209e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
209f0 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
20a00 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
20a10 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
20a20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20a30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
20a40 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
20a50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
20a60 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
20a70 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
20a80 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
20a90 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
20aa0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
20ab0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
20ac0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
20ad0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
20ae0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
20af0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
20b00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
20b10 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
20b20 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
20b30 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
20b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20b50 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
20b60 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
20b70 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
20b80 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
20b90 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
20ba0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
20bb0 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
20bc0 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
20bd0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
20be0 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
20bf0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
20c00 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
20c10 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
20c20 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
20c30 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
20c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
20c50 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
20c60 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
20c70 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
20c80 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
20c90 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
20ca0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
20cb0 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
20cc0 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
20cd0 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
20ce0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
20cf0 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
20d00 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
20d10 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
20d20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20d30 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
20d40 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
20d50 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
20d60 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
20d70 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
20d80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20d90 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
20da0 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
20db0 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
20dc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
20dd0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
20de0 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
20df0 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
20e00 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
20e10 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
20e20 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
20e30 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
20e40 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
20e50 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
20e60 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
20e70 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
20e80 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
20e90 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
20ea0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20eb0 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
20ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20ed0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20ee0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
20ef0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20f00 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
20f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20f20 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
20f30 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
20f40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
20f50 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
20f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20f70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20f80 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
20f90 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
20fa0 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
20fb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
20fc0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
20fd0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
20fe0 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
20ff0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
21000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21010 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
21020 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  .        Pgno nP
21030 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
21040 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21060 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ile */..        
21070 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
21080 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
21090 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
210a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
210b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
210c0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
210d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
210e0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
210f0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
21100 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
21110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21120 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
21130 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
21140 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21150 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
21160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21170 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
21180 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
21190 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
211a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
211b0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
211c0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
211d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
211e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
211f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21200 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
21210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21220 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
21230 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
21240 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
21250 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
21260 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
21270 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
21280 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
21290 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
212a0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
212b0 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
212c0 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
212d0 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
212e0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
212f0 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
21300 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
21310 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
21320 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
21330 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
21340 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
21350 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
21360 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
21370 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
21380 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
21390 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
213a0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
213b0 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
213c0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
213d0 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
213e0 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
213f0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21400 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21410 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
21420 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
21430 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
21440 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
21450 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
21460 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21470 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
21480 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
21490 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
214a0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
214b0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
214c0 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
214d0 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
214e0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
214f0 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
21500 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21510 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
21520 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
21530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
21540 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
21550 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
21560 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21570 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
21580 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
21590 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
215a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
215b0 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
215c0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
215d0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
215e0 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
215f0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
21600 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
21610 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21620 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
21630 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
21640 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
21650 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
21660 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
21670 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
21680 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
21690 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
216a0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
216b0 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
216c0 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
216d0 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
216e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
216f0 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
21700 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
21710 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
21720 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21730 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
21740 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
21750 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
21760 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
21770 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
21780 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21790 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
217a0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
217b0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
217c0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
217d0 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
217e0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
217f0 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
21800 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
21810 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
21820 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
21830 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
21840 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
21850 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
21860 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
21870 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
21880 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
21890 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
218a0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
218b0 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
218c0 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
218d0 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
218e0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
218f0 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
21900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21910 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
21920 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
21930 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
21940 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
21950 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21970 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
21980 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21990 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
219a0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
219b0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
219c0 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
219d0 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
219e0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
219f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
21a00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21a10 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
21a20 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
21a30 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
21a40 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
21a50 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
21a60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21a70 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
21a80 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
21a90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
21aa0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
21ab0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
21ac0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
21ad0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
21ae0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
21af0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21b00 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21b10 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
21b20 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
21b30 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
21b40 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
21b50 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
21b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21b70 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
21b80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
21b90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
21ba0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
21bb0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
21bc0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
21bd0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
21be0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
21bf0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
21c00 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
21c10 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
21c20 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
21c30 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
21c40 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
21c50 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
21c60 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
21c70 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
21c80 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
21c90 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
21ca0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
21cb0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
21cc0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
21cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21ce0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
21cf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21d00 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
21d10 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
21d20 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
21d30 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
21d40 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
21d50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
21d60 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
21d70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
21d80 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
21d90 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
21da0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21db0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
21dc0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
21dd0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21de0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
21df0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21e00 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
21e10 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21e20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
21e30 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
21e40 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21e50 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
21e60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21e70 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
21e80 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
21e90 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
21ea0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
21eb0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
21ec0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21ed0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
21ee0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
21ef0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
21f00 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21f10 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
21f20 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
21f30 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21f40 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
21f50 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
21f60 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
21f70 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
21f80 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
21f90 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21fa0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
21fb0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21fc0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
21fd0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
21fe0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
21ff0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
22000 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
22010 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
22020 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
22030 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
22040 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
22050 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
22060 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
22070 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22080 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22090 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
220a0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
220b0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
220c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
220d0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
220e0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
220f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
22100 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
22110 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
22120 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
22130 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22140 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
22150 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
22160 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
22170 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
22180 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
22190 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
221a0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
221b0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
221c0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
221d0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
221e0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
221f0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
22200 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
22210 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
22220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22240 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
22250 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22260 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22270 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
22280 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
22290 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
222a0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
222b0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
222c0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
222d0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
222e0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
222f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
22300 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22310 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
22320 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
22330 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22340 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22350 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
22360 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
22370 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
22380 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
22390 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
223a0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
223b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
223c0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
223d0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
223e0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
223f0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
22400 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
22410 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22420 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22430 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
22440 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
22450 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
22460 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
22470 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
22480 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
22490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
224a0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
224b0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
224c0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
224d0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
224e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
224f0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22500 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
22510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22520 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
22530 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22550 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
22560 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22570 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
22580 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
22590 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
225a0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
225b0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
225c0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
225d0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
225e0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
225f0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
22600 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
22610 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
22620 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
22630 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
22640 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
22650 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
22660 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
22670 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
22680 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22690 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
226a0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
226b0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
226c0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
226d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
226e0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
226f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
22700 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22710 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
22720 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
22730 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
22740 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
22750 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
22760 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
22770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
22780 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
22790 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
227a0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
227b0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
227c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
227d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
227e0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
227f0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
22800 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
22810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22820 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
22830 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
22840 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
22850 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
22860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22870 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
22880 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
22890 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
228a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
228b0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
228c0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
228d0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
228e0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
228f0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
22900 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
22910 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
22920 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22930 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
22940 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22950 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22960 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22970 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
22980 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22990 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
229a0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
229b0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
229c0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
229d0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
229e0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
229f0 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
22a00 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
22a10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
22a20 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
22a30 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
22a40 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
22a50 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22a60 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
22a70 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22a80 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
22a90 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
22aa0 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
22ab0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
22ac0 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
22ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22ae0 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
22af0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22b00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
22b10 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
22b20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
22b30 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
22b40 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
22b50 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
22b60 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
22b70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22b80 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
22b90 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
22ba0 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
22bb0 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
22bc0 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
22bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
22be0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
22bf0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
22c00 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
22c10 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
22c20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
22c30 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22c40 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
22c50 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
22c60 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
22c70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
22c80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22c90 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
22ca0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
22cb0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
22cc0 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
22cd0 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
22ce0 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
22cf0 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
22d00 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
22d10 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
22d20 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
22d30 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
22d40 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
22d50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22d60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22d70 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
22d80 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
22d90 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
22da0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
22db0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22dc0 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
22dd0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
22de0 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
22df0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22e00 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22e10 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
22e20 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
22e30 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
22e40 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
22e50 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
22e60 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
22e70 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
22e80 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
22e90 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
22ea0 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
22eb0 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a  are four levels:
22ec0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
22ed0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
22ee0 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
22ef0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
22f00 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
22f10 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
22f20 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
22f30 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
22f40 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
22f50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
22f60 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
22f70 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
22f80 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
22f90 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
22fa0 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
22fb0 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
22fc0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
22fd0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
22fe0 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
22ff0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
23000 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
23010 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
23020 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
23030 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
23040 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
23050 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
23060 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
23070 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
23080 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
23090 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
230b0 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
230c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
230d0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
230e0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
230f0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
23100 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
23120 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
23130 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
23140 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
23150 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
23160 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
23170 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
23180 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
23190 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
231a0 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
231b0 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
231c0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
231d0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
231e0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
231f0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
23200 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
23210 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
23230 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
23240 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
23250 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
23260 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
23270 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
23280 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
23290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
232a0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
232b0 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20  *.**    EXTRA   
232c0 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46    This is like F
232d0 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20  ULL except that 
232e0 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68  is also syncs th
232f0 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20  e directory.**  
23300 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
23310 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
23320 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
23330 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63  fter the rollbac
23340 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
23350 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c    journal is unl
23360 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inked..**.** The
23370 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
23380 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
23390 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
233a0 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
233b0 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
233c0 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
233d0 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
233e0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
233f0 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
23400 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
23410 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
23420 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
23430 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23440 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
23450 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
23460 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
23470 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
23480 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
23490 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
234a0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
234b0 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
234c0 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
234d0 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
234e0 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
234f0 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
23500 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
23510 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
23520 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
23530 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
23540 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
23550 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
23560 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
23570 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
23580 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73  ORMAL.  There is
23590 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
235a0 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61  etween FULL.** a
235b0 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c  nd EXTRA for WAL
235c0 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20   mode..**.** Do 
235d0 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
235e0 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
235f0 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
23600 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
23610 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
23620 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
23630 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
23640 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
23650 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
23660 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
23670 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
23680 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
23690 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
236a0 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
236b0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
236c0 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
236d0 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
236e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
236f0 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
23700 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
23710 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
23720 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
23730 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
23740 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
23750 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
23760 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
23770 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
23780 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
23790 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
237a0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
237b0 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
237c0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
237d0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
237e0 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
237f0 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
23800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23810 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
23820 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23830 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65  SetFlags(.  Page
23840 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23850 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
23860 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
23870 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  el for */.  unsi
23880 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
23890 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
238a0 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  gs */.){.  unsig
238b0 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c  ned level = pgFl
238c0 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
238d0 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
238e0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
238f0 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
23900 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
23910 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
23920 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
23930 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23940 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
23950 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
23960 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52   =  level==PAGER
23970 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
23980 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
23990 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
239a0 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel>=PAGER_SYNCH
239b0 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30  RONOUS_FULL ?1:0
239c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
239d0 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  traSync = level=
239e0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
239f0 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20  US_EXTRA ?1:0;. 
23a00 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
23a10 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
23a20 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23a30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23a40 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23a50 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
23a60 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23a70 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23a80 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
23a90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23aa0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23ab0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23ac0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
23ad0 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61 67  yncFlags = (pPag
23ae0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c 32  er->syncFlags<<2
23af0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
23b00 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
23b10 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23b20 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72 2d  Flags |= pPager-
23b30 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d 0a  >syncFlags;.  }.
23b40 20 20 69 66 28 20 28 70 67 46 6c 61 67 73 20 26    if( (pgFlags &
23b50 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
23b60 46 53 59 4e 43 29 20 26 26 20 21 70 50 61 67 65  FSYNC) && !pPage
23b70 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
23b80 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
23b90 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  Flags |= (SQLITE
23ba0 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a  _SYNC_FULL<<2);.
23bb0 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
23bc0 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
23bd0 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
23be0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
23bf0 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
23c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23c10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
23c20 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
23c30 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
23c40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23c50 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
23c60 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
23c70 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
23c80 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
23c90 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
23ca0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23cb0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
23cc0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
23cd0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
23ce0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
23cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23d00 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
23d10 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
23d20 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
23d30 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
23d40 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
23d50 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
23d60 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
23d70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
23d80 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
23d90 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
23da0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
23db0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
23dc0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
23dd0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
23de0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
23df0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
23e00 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
23e10 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
23e20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
23e30 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
23e40 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
23e50 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
23e60 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
23e70 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
23e80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
23e90 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23ea0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23eb0 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
23ec0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
23ed0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
23ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23ef0 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
23f00 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
23f10 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
23f20 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
23f30 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
23f40 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
23f50 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
23f60 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
23f70 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
23f80 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
23f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
23fa0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
23fb0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
23fc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
23fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23fe0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
23ff0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24000 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
24010 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
24020 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
24030 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
24040 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
24050 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
24060 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
24070 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
24080 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
24090 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
240a0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
240b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
240c0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
240d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
240e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
240f0 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
24100 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
24110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
24120 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
24130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24140 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
24150 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
24160 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
24170 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
24180 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
24190 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
241a0 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
241b0 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
241c0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
241d0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
241e0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
241f0 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
24200 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
24210 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
24220 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
24230 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
24240 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
24250 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
24260 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
24270 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
24280 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
24290 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
242a0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
242b0 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
242c0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
242d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
242e0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
242f0 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
24300 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
24310 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
24320 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
24330 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
24340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
24370 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
24380 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
24390 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
243a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
243b0 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
243c0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
243d0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
243e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
243f0 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
24400 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
24410 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
24420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
24430 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
24440 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
24450 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
24460 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
24470 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
24480 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
24490 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
244a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
244b0 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
244c0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
244d0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
244e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
244f0 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
24500 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
24530 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
24540 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
24550 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
24560 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
24570 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
24580 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
24590 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
245a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
245b0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
245c0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
245d0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
245e0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
245f0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
24600 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
24610 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
24620 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
24630 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24640 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
24650 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
24660 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24670 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
24680 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
24690 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
246a0 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
246b0 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
246c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
246d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
246e0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
246f0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
24700 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
24710 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
24720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
24730 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
24740 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
24750 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
24760 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
24770 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
24780 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24790 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
247a0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
247b0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
247c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
247d0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
247e0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
247f0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
24800 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
24810 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
24820 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
24830 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
24840 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
24850 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
24860 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24870 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
24880 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
24890 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
248a0 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
248b0 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
248c0 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
248d0 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
248e0 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
248f0 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
24900 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
24910 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
24920 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
24930 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
24940 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24950 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
24960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24970 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
24980 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24990 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
249a0 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
249b0 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
249c0 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
249d0 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
249e0 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
249f0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
24a00 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
24a10 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24a20 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24a30 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
24a40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24a50 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
24a60 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
24a70 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
24a80 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
24a90 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
24aa0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24ab0 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
24ac0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
24ad0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
24ae0 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
24af0 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
24b00 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
24b10 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
24b20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
24b30 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
24b40 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
24b50 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
24b60 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
24b70 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
24b80 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
24b90 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
24ba0 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
24bb0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
24bc0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
24bd0 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
24be0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24bf0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
24c00 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
24c10 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
24c20 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
24c30 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
24c40 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
24c50 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
24c60 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
24c70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
24c80 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
24c90 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
24ca0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24cb0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
24cc0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
24cd0 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
24ce0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
24cf0 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
24d00 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
24d10 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
24d20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
24d30 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
24d40 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
24d50 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
24d60 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
24d70 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
24d80 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
24d90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
24da0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
24db0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24dc0 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
24dd0 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
24de0 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
24df0 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
24e00 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
24e10 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
24e20 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
24e30 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
24e40 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
24e50 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
24e60 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
24e70 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
24e80 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
24e90 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
24ea0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
24eb0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
24ec0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
24ed0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
24ee0 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
24ef0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
24f00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
24f10 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
24f20 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
24f30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
24f40 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
24f50 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
24f60 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
24f70 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
24f80 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
24f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24fa0 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
24fb0 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
24fc0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
24fd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
24fe0 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
24ff0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25010 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
25020 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
25030 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25050 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
25060 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
25070 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
25080 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
25090 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
250a0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
250b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
250c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
250d0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
250e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
250f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
25100 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
25110 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25120 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
25130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
25150 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
25160 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25170 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
25180 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
25190 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  w;.      pPager-
251a0 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
251b0 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
251c0 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
251d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
251e0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
251f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25200 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
25210 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  ee(pNew);.    }.
25220 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a    }..  *pPageSiz
25230 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
25240 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Size;.  if( rc==
25250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25260 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
25270 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
25280 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
25290 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
252a0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
252b0 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
252c0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
252d0 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
252e0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
252f0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
25300 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
25310 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  it(pPager);.  }.
25320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25330 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
25340 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
25350 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
25360 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
25370 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
25380 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
25390 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
253a0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
253b0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
253c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
253d0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
253e0 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
253f0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
25400 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
25410 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
25420 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
25430 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
25440 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
25450 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
25460 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
25470 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
25480 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
25490 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
254a0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
254b0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
254c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
254d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
254e0 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
254f0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
25500 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
25510 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
25520 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
25530 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
25540 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
25550 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
25560 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
25570 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
25580 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
25590 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
255a0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
255b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
255c0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
255d0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
255e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
255f0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
25600 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25610 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
25620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25630 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
25640 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
25650 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
25660 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
25670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25680 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
25690 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20  OPEN );      /* 
256a0 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f  Called only by O
256b0 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20  P_MaxPgcnt */.  
256c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
256d0 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e  mxPgno>=pPager->
256e0 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50  dbSize );  /* OP
256f0 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63  _MaxPgcnt enforc
25700 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74  es this */.  ret
25710 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
25720 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
25730 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
25740 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
25750 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
25760 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
25770 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
25780 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
25790 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
257a0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
257b0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
257c0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
257d0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
257e0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
257f0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
25800 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
25810 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25820 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
25830 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
25840 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
25850 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
25860 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
25870 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
25880 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
25890 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
258a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
258b0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
258c0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
258d0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
258e0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
258f0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25900 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
25910 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25920 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
25930 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
25940 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25950 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25960 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
25970 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
25980 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
25990 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
259a0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
259b0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
259c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
259d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
259e0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
259f0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
25a00 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
25a10 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
25a20 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
25a30 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
25a40 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
25a50 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
25a60 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
25a70 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
25a80 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
25a90 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
25aa0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
25ab0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
25ac0 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
25ad0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25ae0 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
25af0 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
25b00 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
25b10 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25b20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
25b30 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
25b40 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
25b50 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
25b60 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
25b70 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
25b80 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
25b90 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
25ba0 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
25bb0 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
25bc0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
25bd0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
25be0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
25bf0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
25c00 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
25c10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25c20 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
25c30 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
25c40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
25c50 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
25c60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25c70 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
25c80 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
25c90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25ca0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
25cb0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
25cc0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
25cd0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
25ce0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
25cf0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
25d00 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
25d10 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74  y btree immediat
25d20 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69  ely after creati
25d30 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65  ng.  ** the Page
25d40 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65  r object.  There
25d50 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e   has not been an
25d60 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
25d70 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20  transition.  ** 
25d80 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e  to WAL mode yet.
25d90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25da0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
25db0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69  ger) );..  if( i
25dc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25dd0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
25de0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
25df0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
25e00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25e10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
25e20 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
25e30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
25e40 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
25e50 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
25e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25e70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25e80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
25e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
25ea0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
25eb0 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  when a read-tran
25ec0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
25ed0 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e  on.** the pager.
25ee0 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
25ef0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
25f00 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
25f10 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  abase..**.** How
25f20 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
25f30 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
25f40 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
25f50 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
25f60 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
25f70 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
25f80 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ge file..*/.void
25f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25fa0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
25fb0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
25fc0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
25fd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
25fe0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
25ff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26000 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
26010 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
26020 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
26030 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
26040 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
26050 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
26060 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
26070 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
26080 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
26090 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
260a0 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
260b0 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
260c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
260d0 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
260e0 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
260f0 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
26100 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
26110 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
26120 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
26130 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
26140 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
26150 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
26160 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
26170 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
26180 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
26190 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
261a0 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
261b0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
261c0 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
261d0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
261e0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
261f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
26200 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
26210 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
26220 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
26230 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
26240 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
26250 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
26260 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
26270 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
26280 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
26290 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
262a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
262b0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
262c0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
262d0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
262e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26310 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43   code */..  /* C
26320 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
26330 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
26340 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
26350 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
26360 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
26370 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  ld), or one of t
26380 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  he transitions t
26390 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
263a0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
263b0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
263c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
263d0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
263e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
263f0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
26400 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
26410 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
26420 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
26430 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
26440 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  Lock==NO_LOCK &&
26450 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
26460 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c  D_LOCK).       |
26470 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
26480 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
26490 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  && locktype==EXC
264a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
264b0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  ;..  do {.    rc
264c0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
264d0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
264e0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
264f0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
26500 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
26510 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
26520 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
26530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26540 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
26550 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26560 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
26570 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
26580 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
26590 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
265a0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
265b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
265c0 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
265d0 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
265e0 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
265f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
26600 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
26610 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
26620 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
26630 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
26640 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
26650 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
26660 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
26670 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
26680 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
26690 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
266a0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
266b0 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
266c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
266d0 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
266e0 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
266f0 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
26700 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
26710 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
26720 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
26730 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
26740 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
26750 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
26760 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
26770 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
26780 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
26790 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
267a0 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
267b0 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
267c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
267d0 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
267e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
267f0 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
26800 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
26810 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
26820 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
26830 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
26840 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75  ect behavior wou
26850 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
26860 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
26870 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
26880 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
26890 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
268a0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
268b0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
268c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
268d0 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
268e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
268f0 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
26900 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
26910 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
26920 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
26930 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
26940 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
26950 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
26960 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
26970 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
26980 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
26990 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
269a0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
269b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
269c0 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
269d0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
269e0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
269f0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
26a00 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
26a10 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
26a20 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
26a30 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
26a40 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
26a50 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
26a60 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
26a70 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26a80 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
26a90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
26aa0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
26ab0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
26ac0 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
26ad0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26ae0 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
26af0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
26b00 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26b10 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
26b20 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
26b30 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
26b40 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
26b50 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
26b60 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
26b70 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
26b80 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
26b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26ba0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
26bb0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
26bc0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
26bd0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
26be0 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
26bf0 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
26c00 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
26c10 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
26c20 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
26c30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
26c40 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
26c50 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
26c60 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
26c70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
26c80 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
26c90 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
26ca0 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
26cb0 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
26cc0 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
26cd0 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
26ce0 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
26cf0 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
26d00 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
26d10 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
26d20 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
26d30 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
26d40 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
26d50 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
26d60 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
26d70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26d80 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
26d90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26da0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
26db0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
26dc0 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
26dd0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
26de0 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
26df0 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
26e00 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
26e10 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26e20 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
26e30 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
26e40 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
26e50 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
26e60 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
26e70 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
26e80 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
26e90 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
26ea0 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
26eb0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
26ec0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
26ed0 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
26ee0 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
26ef0 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
26f00 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
26f10 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
26f20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26f30 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
26f40 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
26f50 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
26f60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
26f70 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
26f80 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
26f90 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
26fa0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
26fb0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
26fc0 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
26fd0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
26fe0 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
26ff0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
27000 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
27010 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
27020 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
27030 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
27040 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
27050 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27060 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27070 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
27080 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
27090 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
270a0 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
270b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
270c0 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
270d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
270e0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
270f0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
27100 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
27110 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
27120 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
27130 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
27140 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
27150 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
27160 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27170 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
27180 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
27190 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
271a0 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
271b0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
271c0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
271d0 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
271e0 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
271f0 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
27200 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
27210 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
27220 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
27230 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
27240 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
27250 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
27260 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
27270 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
27280 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27290 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
272a0 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
272b0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
272c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
272d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
272e0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
272f0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
27300 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
27310 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
27320 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
27330 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
27350 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
27360 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
27370 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
27380 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
27390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
273a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
273b0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  IZE>0./*.** Obta
273c0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
273d0 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
273e0 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
273f0 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
27400 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
27410 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
27420 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
27430 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
27440 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
27450 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
27460 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
27470 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
27480 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
27490 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
274a0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
274b0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
274c0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
274d0 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
274e0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
274f0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
27500 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
27510 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
27520 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
27530 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
27540 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27550 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
27560 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
27570 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
27580 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275a0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
275b0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
275e0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
275f0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
27600 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
27610 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
27620 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
27630 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
27640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27650 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
27660 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
27670 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
276a0 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
276b0 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
276c0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
276d0 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
276e0 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
276f0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27700 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
27710 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
27720 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
27730 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  rty = 0;.    ass
27740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78  ert( pPager->nEx
27750 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65  tra>=8 );.    me
27760 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
27770 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 8);.  }else{.
27780 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
27790 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74  = (PgHdr *)sqlit
277a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
277b0 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61  eof(PgHdr) + pPa
277c0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
277d0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
277e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
277f0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
27800 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
27810 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27820 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
27830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27840 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
27850 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
27860 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
27870 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
27880 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
27890 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
278a0 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
278b0 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
278c0 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
278d0 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
278e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
278f0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
27900 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
27910 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
27920 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
27930 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
27940 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
27950 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
27960 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
27970 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
27980 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
27990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
279a0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
279b0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
279c0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
279d0 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
279e0 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
279f0 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
27a00 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
27a10 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
27a20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27a30 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
27a40 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
27a50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27a60 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
27a70 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
27a80 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
27a90 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
27aa0 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
27ab0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27ac0 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
27ad0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
27ae0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
27af0 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
27b00 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
27b10 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
27b20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
27b30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27b40 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
27b50 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
27b60 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
27b70 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
27b80 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
27b90 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
27ba0 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
27bb0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
27bc0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
27bd0 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
27be0 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
27bf0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
27c00 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
27c10 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
27c20 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
27c30 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
27c40 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
27c50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27c60 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
27c70 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
27c80 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
27c90 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
27ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
27cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27cc0 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74 20   still where it 
27cd0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
27ce0 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
27cf0 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
27d00 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
27d10 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
27d20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
27d30 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
27d40 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
27d50 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
27d60 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
27d70 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
27d80 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
27d90 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
27da0 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
27db0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
27dc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
27dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27de0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
27df0 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
27e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27e20 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
27e30 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
27e40 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
27e50 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
27e60 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
27e70 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
27e80 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
27e90 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27ea0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
27eb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
27ec0 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
27ed0 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
27ee0 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
27ef0 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
27f00 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
27f10 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
27f20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
27f30 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
27f40 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
27f50 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
27f60 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
27f70 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
27f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
27f90 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
27fa0 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
27fb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
27fc0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
27fd0 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
27fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
27ff0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
28000 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
28010 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
28020 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
28030 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
28040 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
28050 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
28060 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28070 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
28080 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
28090 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
280a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
280b0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
280c0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
280d0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
280e0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
280f0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
28100 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
28110 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
28120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
28130 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
28140 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
28150 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
28160 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28170 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
28180 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
28190 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
281a0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
281b0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
281c0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
281d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
281e0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
281f0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
28200 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
28210 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
28220 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28230 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
28240 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
28250 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
28260 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
28270 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20  ite3 *db){.  u8 
28280 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50 61  *pTmp = (u8*)pPa
28290 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
282a0 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20    assert( db || 
282b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
282c0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
282d0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
282e0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
282f0 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
28300 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
28310 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
28320 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
28330 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
28340 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
28350 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
28360 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
28370 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
28380 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
28390 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
283a0 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 30   {.    u8 *a = 0
283b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
283c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c   || pPager->pWal
283d0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ==0 );.    if( d
283e0 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c 61  b && 0==(db->fla
283f0 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b  gs & SQLITE_NoCk
28400 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20 20  ptOnClose) .    
28410 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64   && SQLITE_OK==d
28420 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
28430 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b 0a  (pPager).    ){.
28440 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b 0a        a = pTmp;.
28450 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28460 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
28470 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67  ->pWal, db, pPag
28480 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
28490 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
284a0 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67 65  ze,a);.    pPage
284b0 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20 7d  r->pWal = 0;.  }
284c0 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
284d0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
284e0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
284f0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
28500 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
28510 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
28520 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
28530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
28540 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
28550 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
28560 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
28570 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
28580 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
28590 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
285a0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
285b0 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
285c0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
285d0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
285e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
285f0 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
28600 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
28610 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
28620 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
28630 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
28640 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
28650 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
28660 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
28670 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
28680 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
28690 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
286a0 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
286b0 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
286c0 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
286d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
286e0 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
286f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28700 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
28710 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
28720 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
28730 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
28740 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
28750 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
28760 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
28770 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
28780 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
28790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
287a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
287b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
287c0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
287d0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
287e0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
287f0 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
28800 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
28810 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
28820 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
28830 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
28840 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
28850 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
28860 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
28870 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
28880 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28890 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
288a0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
288b0 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
288c0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
288d0 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
288e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
288f0 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
28900 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
28910 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28920 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
28930 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
28940 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
28950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
28960 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
28970 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
28980 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
28990 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
289a0 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
289b0 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
289c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
289d0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
289e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
289f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28a00 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
28a10 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
28a20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28a30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
28a40 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
28a50 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
28a60 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
28a70 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
28a80 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
28a90 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
28aa0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
28ab0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
28ac0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
28ad0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
28ae0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
28af0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
28b00 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
28b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
28b20 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
28b30 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
28b40 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
28b50 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
28b60 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
28b70 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
28b80 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
28b90 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
28ba0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
28bb0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
28bc0 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
28bd0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
28be0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
28bf0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
28c00 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
28c10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
28c20 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
28c30 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
28c40 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
28c50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28c60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
28c70 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
28c80 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
28c90 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
28ca0 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
28cb0 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
28cc0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
28cd0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
28ce0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
28cf0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
28d00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
28d10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
28d20 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
28d30 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
28d40 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
28d50 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
28d60 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
28d70 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
28d80 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
28d90 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
28da0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
28db0 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
28dc0 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
28dd0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
28de0 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
28df0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
28e00 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
28e10 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
28e20 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
28e30 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
28e40 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
28e50 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
28e60 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
28e70 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
28e80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28e90 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
28ea0 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
28eb0 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
28ec0 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
28ed0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
28ee0 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
28ef0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
28f00 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
28f10 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
28f20 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
28f30 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
28f40 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
28f50 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
28f60 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
28f70 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
28f80 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
28f90 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
28fa0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
28fb0 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
28fc0 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
28fd0 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
28fe0 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
28ff0 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
29000 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
29010 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  *   }.**.** If s
29020 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
29030 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
29040 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
29050 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
29060 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
29070 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
29080 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
29090 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
290a0 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
290b0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
290c0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
290d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
290e0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
290f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29100 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
29110 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
29120 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72  newHdr){.  int r
29130 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
29140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29150 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
29160 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29170 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
29180 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
29190 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
291a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
291b0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
291c0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
291d0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
291e0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
291f0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
29200 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
29210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
29220 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
29230 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
29240 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29250 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
29260 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
29270 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
29280 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
29290 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
292a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
292b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
292c0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
292d0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
292e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
292f0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
29300 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
29310 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
29320 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29330 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
29340 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
29350 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
29360 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
29370 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
29380 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
29390 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
293a0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
293b0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
293c0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
293d0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
293e0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
293f0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
29400 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
29410 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
29420 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
29430 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
29440 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
29450 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
29460 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
29470 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
29480 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
29490 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
294a0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
294b0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
294c0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
294d0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
294e0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
294f0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
29500 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
29510 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
29520 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
29530 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
29540 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
29550 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29560 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
29570 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
29580 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
29590 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
295a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
295b0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
295c0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
295d0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
295e0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
295f0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
29600 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
29610 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
29620 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
29630 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
29640 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
29650 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
29660 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
29670 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
29680 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
29690 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
296a0 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
296b0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
296c0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
296d0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
296e0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
296f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29700 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
29710 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
29720 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
29730 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
29740 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
29750 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
29760 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
29770 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
29780 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
29790 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
297a0 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
297b0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
297c0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
297d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
297e0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
297f0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
29800 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
29810 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
29820 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
29830 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
29840 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
29850 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
29860 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
29870 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
29880 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
29890 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
298a0 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
298b0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
298c0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
298d0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
298e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
298f0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
29900 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
29910 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
29920 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
29930 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
29940 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
29950 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
29960 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
29970 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
29980 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
29990 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
299a0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
299b0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
299c0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
299d0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
299e0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
299f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
29a00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29a10 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
29a20 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
29a30 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
29a40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29a50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
29a60 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
29a70 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
29a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
29a90 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
29aa0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
29ab0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29ac0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
29ad0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
29ae0 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
29af0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
29b00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29b10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
29b20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
29b30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
29b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29b50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
29b60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
29b70 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
29b80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29b90 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
29ba0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
29bb0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
29bc0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
29bd0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
29be0 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
29bf0 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
29c00 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
29c10 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
29c20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
29c30 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
29c40 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
29c50 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
29c60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29c70 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
29c80 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
29c90 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
29ca0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
29cb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
29cc0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
29cd0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
29ce0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
29cf0 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
29d00 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
29d10 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
29d20 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
29d30 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
29d40 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
29d50 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
29d60 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
29d70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
29d80 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
29d90 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
29da0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
29db0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
29dc0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
29dd0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
29de0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
29df0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
29e00 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
29e10 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
29e20 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
29e30 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29e40 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
29e50 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
29e60 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
29e70 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
29e80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
29e90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
29ea0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
29eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29ed0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29ee0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
29ef0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
29f00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
29f10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
29f20 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
29f30 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
29f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
29f50 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
29f60 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
29f70 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
29f80 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
29f90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29fb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29fc0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
29fd0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
29fe0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
29ff0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
2a000 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
2a010 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
2a020 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2a030 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2a040 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
2a050 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
2a060 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2a070 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2a080 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
2a090 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
2a0a0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2a0b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
2a0c0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
2a0d0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
2a0e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a0f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a100 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a110 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
2a120 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
2a130 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2a140 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
2a150 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
2a160 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
2a170 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
2a180 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
2a190 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2a1a0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2a1b0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
2a1c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a1d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2a1e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2a1f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
2a200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
2a210 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a220 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
2a230 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
2a240 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
2a250 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
2a260 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
2a270 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
2a280 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
2a290 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
2a2a0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
2a2b0 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
2a2c0 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
2a2d0 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
2a2e0 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
2a2f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2a300 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
2a310 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
2a320 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
2a330 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2a340 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2a350 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a360 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2a370 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2a380 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
2a390 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
2a3a0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
2a3b0 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
2a3c0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
2a3d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2a3e0 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
2a3f0 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
2a400 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
2a410 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
2a420 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2a430 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
2a440 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
2a450 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
2a460 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
2a470 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2a480 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
2a490 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
2a4a0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
2a4b0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2a4c0 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
2a4d0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
2a4e0 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
2a4f0 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
2a500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2a510 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
2a520 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
2a530 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
2a540 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
2a550 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
2a560 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
2a570 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
2a580 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
2a590 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
2a5a0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
2a5b0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
2a5c0 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
2a5d0 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
2a5e0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
2a5f0 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
2a600 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
2a610 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
2a620 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
2a630 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
2a640 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
2a650 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
2a660 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
2a670 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
2a680 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
2a690 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
2a6a0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
2a6b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
2a6c0 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
2a6d0 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
2a6e0 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
2a6f0 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
2a700 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2a710 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
2a720 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
2a730 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
2a740 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
2a750 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
2a760 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
2a770 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
2a780 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
2a790 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
2a7a0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
2a7b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a7c0 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
2a7d0 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
2a7e0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
2a7f0 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
2a800 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
2a810 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
2a820 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
2a830 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
2a840 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
2a850 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
2a860 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
2a870 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2a880 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
2a890 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2a8a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2a8b0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2a8c0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
2a8d0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2a8e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2a8f0 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
2a900 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
2a910 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
2a920 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
2a930 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2a940 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2a950 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
2a960 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
2a970 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
2a980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a9b0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
2a9c0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
2a9d0 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
2a9e0 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
2a9f0 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
2aa00 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
2aa10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2aa20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
2aa30 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2aa40 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
2aa50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2aa60 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
2aa70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2aa80 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
2aa90 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2aaa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2aab0 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69  d) || pList->pDi
2aac0 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
2aad0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
2aae0 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
2aaf0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2ab00 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
2ab10 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
2ab20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
2ab30 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
2ab40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2ab50 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
2ab60 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
2ab70 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
2ab80 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2ab90 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
2aba0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2abb0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
2abc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2abd0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
2abe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2abf0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2ac00 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2ac10 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2ac20 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
2ac30 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
2ac40 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
2ac50 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
2ac60 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
2ac70 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
2ac80 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
2ac90 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
2aca0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2acb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2acc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2acd0 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
2ace0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2acf0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
2ad00 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
2ad10 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
2ad20 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
2ad30 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
2ad40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
2ad50 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
2ad60 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2ad70 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
2ad80 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
2ad90 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2ada0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
2adb0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2adc0 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
2add0 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
2ade0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
2adf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2ae00 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
2ae10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2ae20 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
2ae30 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
2ae40 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
2ae50 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
2ae60 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
2ae70 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
2ae80 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
2ae90 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
2aea0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
2aeb0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
2aec0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
2aed0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
2aee0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
2aef0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
2af00 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
2af10 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
2af20 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
2af30 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
2af40 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
2af50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
2af60 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
2af70 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
2af80 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
2af90 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
2afa0 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
2afb0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
2afc0 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
2afd0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
2afe0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
2aff0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
2b000 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
2b010 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
2b020 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
2b030 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
2b040 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
2b050 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
2b060 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
2b070 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2b0a0 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
2b0b0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2b0c0 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2b0d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2b0e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2b0f0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
2b100 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
2b110 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
2b120 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
2b130 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2b140 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2b150 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2b160 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2b170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b180 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b  EM_BKPT, pData);
2b190 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
2b1a0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
2b1b0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
2b1c0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2b1d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
2b1e0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
2b1f0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
2b200 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
2b210 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
2b220 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
2b230 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
2b240 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
2b250 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
2b260 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
2b270 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
2b280 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
2b290 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
2b2a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b2b0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
2b2c0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
2b2d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2b2e0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
2b2f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b300 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
2b310 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
2b320 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2b330 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2b340 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
2b350 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
2b360 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
2b370 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2b380 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
2b390 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2b3a0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
2b3b0 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
2b3c0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
2b3d0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
2b3e0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
2b3f0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
2b400 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
2b410 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
2b420 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
2b430 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
2b440 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
2b450 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2b460 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
2b470 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2b4a0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
2b4b0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
2b4c0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2b4d0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
2b4e0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2b4f0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
2b500 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2b510 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
2b520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b530 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
2b540 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
2b550 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b560 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2b570 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2b580 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2b590 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2b5a0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2b5b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2b5c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2b5d0 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2b5e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2b5f0 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2b600 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2b610 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2b620 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2b630 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b640 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2b650 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2b660 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2b670 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2b680 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2b690 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2b6a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2b6b0 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2b6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b6d0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2b6e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2b6f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b700 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2b710 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2b720 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
2b730 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54  t flags =  SQLIT
2b740 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2b750 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
2b760 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20  READWRITE .     
2b770 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
2b780 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
2b790 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  PEN_EXCLUSIVE . 
2b7a0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2b7b0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2b7c0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53  ;.    int nStmtS
2b7d0 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
2b7e0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
2b7f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2b800 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2b810 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b820 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2b830 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2b840 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69  {.      nStmtSpi
2b850 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ll = -1;.    }. 
2b860 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2b870 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2b880 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67  r->pVfs, 0, pPag
2b890 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c  er->sjfd, flags,
2b8a0 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20   nStmtSpill);.  
2b8b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b8c0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2b8d0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2b8e0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2b8f0 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2b900 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2b910 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b920 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2b930 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2b940 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2b950 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2b960 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2b970 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2b980 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2b990 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2b9a0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2b9b0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2b9c0 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2b9d0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2b9e0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2b9f0 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2ba00 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2ba10 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2ba20 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2ba30 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2ba40 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2ba50 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2ba60 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2ba70 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2ba80 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2ba90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2baa0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2bab0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2bac0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2bad0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2bae0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2baf0 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2bb00 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2bb10 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2bb20 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2bb30 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2bb40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2bb50 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2bb60 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2bb70 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2bb80 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bb90 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2bba0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2bbb0 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2bbc0 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2bbd0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2bbe0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2bbf0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2bc00 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2bc10 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2bc20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2bc30 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2bc40 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2bc50 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2bc60 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2bc70 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2bc80 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2bc90 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2bca0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2bcb0 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2bcc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2bcd0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2bce0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2bcf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bd00 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2bd10 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2bd20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2bd30 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2bd40 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2bd50 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2bd60 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2bd70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  ;..#if SQLITE_HA
2bd80 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20  S_CODEC   .     
2bd90 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75   if( !pPager->su
2bda0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2bdb0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2bdc0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2bdd0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2bde0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2bdf0 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  PT, pData2);.   
2be00 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2be10 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 70        pData2 = p
2be20 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45  Data;.      PAGE
2be30 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
2be40 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2be50 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2be60 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2be70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
2be80 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2be90 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
2bea0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2beb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2bed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2bee0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2bef0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
2bf00 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2bf10 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
2bf20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2bf30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bf40 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2bf50 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
2bf60 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2bf70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
2bf80 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
2bf90 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2bfa0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
2bfb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bfc0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2bfd0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2bfe0 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b  red(PgHdr *pPg){
2bff0 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69  .  if( subjRequi
2c000 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2c010 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f      return subjo
2c020 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2c030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2c040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c050 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2c060 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c070 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2c080 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2c090 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2c0a0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2c0b0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2c0c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2c0d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2c0e0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2c0f0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2c100 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2c110 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2c120 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2c130 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2c140 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2c150 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2c160 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2c170 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2c180 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2c190 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2c1a0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2c1b0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2c1c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c1d0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2c1e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2c1f0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2c200 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2c210 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2c220 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2c230 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2c240 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2c250 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2c260 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2c270 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2c280 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2c290 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2c2a0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2c2b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2c2c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2c2d0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2c2e0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2c2f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2c300 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2c310 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2c320 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2c330 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2c340 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2c350 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2c360 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2c370 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2c380 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2c390 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2c3a0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2c3b0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2c3c0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2c3d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2c3e0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2c3f0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2c400 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2c410 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2c420 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2c430 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2c440 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2c450 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c460 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2c470 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2c480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2c490 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2c4a0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2c4b0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2c4c0 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2c4d0 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2c4e0 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2c4f0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2c500 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2c510 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2c520 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2c530 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2c540 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2c550 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2c560 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2c570 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2c580 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2c590 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2c5a0 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2c5b0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2c5c0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2c5d0 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2c5e0 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2c5f0 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2c600 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2c610 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2c620 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2c630 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2c640 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2c650 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2c660 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2c670 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2c680 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2c690 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2c6a0 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2c6b0 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2c6c0 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2c6d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2c6e0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2c6f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2c700 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2c710 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2c720 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2c730 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2c740 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20   createFlag==3. 
2c750 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2c760 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2c770 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2c780 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2c790 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2c7a0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2c7b0 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2c7c0 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2c7d0 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2c7e0 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2c7f0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2c800 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2c810 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2c820 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2c830 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2c840 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2c850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73  SQLITE_OK;.  tes
2c860 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2c870 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2c880 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29  LFLAG_ROLLBACK )
2c890 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2c8a0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c8b0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46   & SPILLFLAG_OFF
2c8c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2c8d0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c8e0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
2c8f0 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70  OSYNC );.  if( p
2c900 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c910 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72  l.   && ((pPager
2c920 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28  ->doNotSpill & (
2c930 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2c940 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  CK|SPILLFLAG_OFF
2c950 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28  ))!=0.      || (
2c960 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2c970 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2c980 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2c990 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2c9a0 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
2c9b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2c9c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2c9d0 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
2c9e0 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2c9f0 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2ca00 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  he log. */.    r
2ca10 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2ca20 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67  geIfRequired(pPg
2ca30 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ); .    if( rc==
2ca40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ca50 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2ca60 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2ca70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2ca80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23  .  }else{.    .#
2ca90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2caa0 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
2cab0 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20 70  _WRITE.    if( p
2cac0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
2cad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2cae0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2caf0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
2cb00 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2cb10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2cb20 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2cb30 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2cb40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2cb50 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2cb60 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
2cb70 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
2cb80 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2cb90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
2cba0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
2cbb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2cbc0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
2cbd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2cbe0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2cbf0 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
2cc00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2cc10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2cc20 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
2cc30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2cc40 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2cc50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc60 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
2cc70 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2cc80 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2cc90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
2cca0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
2ccb0 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
2ccc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
2ccd0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2cce0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
2ccf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cd00 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2cd10 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
2cd20 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2cd30 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2cd40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
2cd50 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
2cd60 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2cd70 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2cd80 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a  ger, rc); .}../*
2cd90 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e  .** Flush all un
2cda0 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74 79  referenced dirty
2cdb0 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a   pages to disk..
2cdc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2cdd0 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a  gerFlush(Pager *
2cde0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2cdf0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
2ce00 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ode;.  if( !MEMD
2ce10 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
2ce20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
2ce30 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2ce40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2ce50 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
2ce60 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2ce70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77  pPager) );.    w
2ce80 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2ce90 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
2cea0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65        PgHdr *pNe
2ceb0 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
2cec0 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  ty;.      if( pL
2ced0 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ist->nRef==0 ){.
2cee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2cef0 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29  erStress((void*)
2cf00 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a  pPager, pList);.
2cf10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
2cf20 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  ist = pNext;.   
2cf30 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2cf40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
2cf50 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2cf60 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
2cf70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
2cf80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2cf90 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
2cfa0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
2cfb0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
2cfc0 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
2cfd0 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
2cfe0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
2cff0 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
2d000 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
2d010 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
2d020 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2d030 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
2d040 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
2d050 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
2d060 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
2d070 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
2d080 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
2d090 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
2d0a0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
2d0b0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
2d0c0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
2d0d0 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
2d0e0 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
2d0f0 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
2d100 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
2d110 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
2d120 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
2d130 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
2d140 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
2d150 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2d160 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2d170 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2d180 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2d190 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2d1a0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2d1b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2d1c0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2d1d0 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2d1e0 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2d1f0 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2d200 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2d210 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2d220 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2d230 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 20  GetExtra() API. 
2d240 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61 67 65   When a new page
2d250 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74   is allocated, t
2d260 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20 62 79  he.** first 8 by
2d270 74 65 73 20 6f 66 20 74 68 69 73 20 73 70 61 63  tes of this spac
2d280 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62 75 74  e are zeroed but
2d290 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69   the remainder i
2d2a0 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  s uninitialized.
2d2b0 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61 20 73  .** (The extra s
2d2c0 70 61 63 65 20 69 73 20 75 73 65 64 20 62 79 20  pace is used by 
2d2d0 62 74 72 65 65 20 61 73 20 74 68 65 20 4d 65 6d  btree as the Mem
2d2e0 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a  Page object.).**
2d2f0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
2d300 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
2d310 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
2d320 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
2d330 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
2d340 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
2d350 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
2d360 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
2d370 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
2d380 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66  of the PAGER_* f
2d390 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
2d3a0 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
2d3b0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
2d3c0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
2d3d0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
2d3e0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
2d3f0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
2d400 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
2d410 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
2d420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
2d430 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
2d440 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
2d450 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
2d460 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
2d470 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
2d480 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
2d490 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
2d4a0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
2d4b0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
2d4c0 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
2d4d0 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
2d4e0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
2d4f0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
2d500 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
2d510 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2d520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d530 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
2d540 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
2d550 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
2d560 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
2d570 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
2d580 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
2d590 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2d5a0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
2d5b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2d5c0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
2d5d0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
2d5e0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
2d5f0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
2d600 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
2d610 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
2d620 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
2d630 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2d640 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2d650 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2d660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2d670 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2d680 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
2d690 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
2d6a0 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
2d6b0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2d6c0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2d6d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d6e0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2d6f0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2d700 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2d710 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2d720 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2d730 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2d740 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2d750 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2d760 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2d770 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2d780 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2d790 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2d7a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2d7b0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2d7c0 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2d7d0 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2d7e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2d7f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2d800 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d810 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2d820 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2d830 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2d840 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2d850 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2d860 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2d870 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d880 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2d890 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2d8a0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
2d8b0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2d8c0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
2d8d0 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
2d8e0 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
2d8f0 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
2d900 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2d910 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
2d920 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
2d930 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
2d940 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
2d950 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2d960 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2d970 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2d980 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2d990 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2d9a0 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2d9b0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2d9c0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2d9d0 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2d9e0 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2d9f0 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
2da00 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
2da10 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
2da20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2da30 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
2da40 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65   */.  u32 szPage
2da50 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
2da60 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2da70 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
2da80 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73  e size */.  cons
2da90 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30  t char *zUri = 0
2daa0 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73  ;    /* URI args
2dab0 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
2dac0 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20  t nUri = 0;     
2dad0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2dae0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49   of bytes of URI
2daf0 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a   args at *zUri *
2db00 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
2db10 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
2db20 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
2db30 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2db40 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
2db50 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
2db60 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
2db70 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
2db80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20   sub-journal).  
2db90 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  */.  journalFile
2dba0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2dbb0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2dbc0 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53  (pVfs));..  /* S
2dbd0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2dbe0 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2dbf0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2dc00 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2dc10 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2dc20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2dc30 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2dc40 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2dc50 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2dc60 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2dc70 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2dc80 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2dc90 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2dca0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2dcb0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2dcc0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2dcd0 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2dce0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2dcf0 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20        nPathname 
2dd00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2dd10 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2dd20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
2dd30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
2dd40 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  dif..  /* Comput
2dd50 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
2dd60 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
2dd70 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
2dd80 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
2dd90 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
2dda0 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
2ddb0 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
2ddc0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2ddd0 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
2dde0 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
2ddf0 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
2de00 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
2de10 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2de20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2de30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2de40 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  z;.    nPathname
2de50 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
2de60 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
2de70 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2de80 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61  MallocRaw(0, nPa
2de90 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
2dea0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2deb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2dec0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2ded0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  T;.    }.    zPa
2dee0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2def0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2df00 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2df10 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2df20 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2df30 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2df40 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2df50 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2df60 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2df70 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2df80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2df90 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2dfa0 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2dfb0 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2dfc0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2dfd0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2dfe0 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2dff0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e000 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2e010 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2e020 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2e030 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2e040 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2e050 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2e060 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2e070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2e080 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2e090 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2e0a0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2e0b0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2e0c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2e0d0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2e0e0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2e0f0 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2e100 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2e110 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2e120 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2e130 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2e140 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2e150 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2e160 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2e170 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2e180 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2e190 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2e1a0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2e1b0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2e1c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2e1d0 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2e1e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2e1f0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2e200 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2e210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2e230 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2e240 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2e250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e260 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2e270 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2e280 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2e290 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2e2a0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2e2b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e2c0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2e2d0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2e2e0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2e2f0 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2e300 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2e310 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2e320 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2e330 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2e350 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2e360 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2e370 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2e380 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2e390 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2e3a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e3b0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2e3c0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2e3d0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2e3e0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e3f0 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2e400 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2e410 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2e420 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2e430 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2e440 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2e450 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2e460 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2e470 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2e480 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2e490 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2e4a0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2e4b0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2e4c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2e4d0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2e4e0 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2e4f0 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2e500 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2e510 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2e520 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2e530 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2e540 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2e550 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2e560 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2e570 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2e580 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2e590 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2e5a0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2e5b0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2e5c0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2e5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e5e0 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2e5f0 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2e600 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2e610 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2e620 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2e630 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20  athname + 8 + 2 
2e640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e650 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2e660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e670 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2e680 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20  ame + 4 + 2     
2e690 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2e6a0 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2e6b0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2e6c0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2e6d0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2e6e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2e6f0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2e700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2e710 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2e720 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2e730 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2e740 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2e760 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2e770 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2e780 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2e790 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2e7a0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2e7b0 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2e7c0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2e7d0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2e7e0 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2e7f0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2e800 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2e810 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2e820 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2e830 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2e840 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2e850 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2e860 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2e870 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2e880 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2e890 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2e8a0 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2e8b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2e8c0 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2e8d0 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2e8e0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2e8f0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2e900 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2e910 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2e920 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2e930 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2e940 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2e950 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2e960 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2e970 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2e980 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2e990 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2e9a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2e9b0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2e9c0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2e9d0 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2e9e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2e9f0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2ea00 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2ea10 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2ea20 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2ea30 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2ea40 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2ea50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2ea60 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2ea70 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2ea80 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2ea90 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2eaa0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2eab0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2eac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2ead0 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2eae0 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2eaf0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2eb00 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2eb10 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2eb20 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2eb30 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2eb40 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2eb50 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2eb60 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2eb70 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2eb80 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2eb90 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2eba0 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2ebb0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2ebc0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2ebd0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2ebe0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2ebf0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2ec00 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2ec10 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2ec20 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2ec30 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2ec40 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2ec50 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec70 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2ec80 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2ec90 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2eca0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2ecb0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2ecc0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2ecd0 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2ece0 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2ecf0 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2ed00 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2ed10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2ed20 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2ed30 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2ed40 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2ed50 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2ed60 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2ed70 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2ed80 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2ed90 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2eda0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2edb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2edc0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2edd0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2ede0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2edf0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2ee00 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2ee10 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2ee20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2ee30 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2ee40 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2ee50 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2ee60 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2ee70 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2ee80 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2ee90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2eea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2eeb0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2eec0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2eed0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2eee0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2eef0 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2ef00 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2ef10 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2ef20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ef30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2ef40 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2ef50 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2ef60 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2ef70 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2ef80 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2ef90 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2efa0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2efb0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2efc0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2efd0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2efe0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2eff0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f000 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2f010 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f020 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2f030 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2f040 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2f050 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f060 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2f070 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2f080 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2f090 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2f0a0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2f0b0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2f0c0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2f0d0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2f0e0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2f0f0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2f100 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2f110 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f120 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f130 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2f140 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2f150 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2f160 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2f170 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f180 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2f190 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2f1a0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2f1b0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2f1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f1d0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2f1e0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2f1f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f200 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2f210 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2f220 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2f230 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f240 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2f250 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2f260 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2f270 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2f280 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2f290 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2f2a0 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2f2b0 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2f2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2f2d0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2f2e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2f2f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2f300 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2f310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2f330 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2f340 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2f350 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2f360 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2f370 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2f380 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2f390 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2f3a0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2f3b0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2f3c0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2f3d0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2f3e0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2f3f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f400 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2f410 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2f420 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2f430 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2f440 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2f450 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2f460 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2f470 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2f480 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2f490 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2f4a0 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2f4b0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2f4c0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2f4d0 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2f4e0 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2f4f0 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2f500 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2f510 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2f520 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2f530 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2f540 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2f550 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2f560 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2f570 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2f580 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2f590 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2f5a0 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2f5b0 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2f5c0 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2f5d0 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f5f0 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2f600 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2f610 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2f620 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2f630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2f640 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2f650 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2f660 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2f670 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2f680 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2f690 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2f6a0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2f6b0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2f6c0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2f6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f6e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f6f0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2f700 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f710 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2f720 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2f730 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2f740 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2f750 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2f760 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2f770 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2f780 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74  E_OK ){.    nExt
2f7a0 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2f7b0 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ra);.    assert(
2f7c0 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45   nExtra>=8 && nE
2f7d0 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
2f7e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2f7f0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2f800 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2f810 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2f820 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2f830 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2f840 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2f850 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2f860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2f870 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2f880 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2f890 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2f8a0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2f8b0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2f8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f8d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2f8e0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2f8f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2f900 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2f910 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2f920 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2f930 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2f940 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2f950 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2f960 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2f970 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2f980 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f990 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2f9a0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2f9b0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2f9c0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2f9d0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2f9e0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2f9f0 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2fa00 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2fa10 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fa20 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2fa30 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2fa40 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2fa50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2fa60 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2fa70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2fa80 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fa90 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2faa0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2fab0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2fac0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2fad0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2fae0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2faf0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fb00 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2fb10 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2fb20 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2fb30 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2fb40 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2fb50 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2fb60 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2fb70 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2fb80 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2fb90 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2fba0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2fbb0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2fbc0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2fbd0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2fbe0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2fbf0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2fc00 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2fc10 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2fc20 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2fc30 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2fc40 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2fc50 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2fc60 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2fc70 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2fc80 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2fc90 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2fca0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
2fcb0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2fcc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2fcd0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2fce0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2fcf0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61  t( pPager->extra
2fd00 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2fd10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2fd20 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2fd30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fd40 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
2fd50 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2fd60 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2fd70 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2fd80 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
2fd90 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
2fda0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2fdb0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2fdc0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2fdd0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2fde0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2fdf0 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  (SQLITE_SYNC_NOR
2fe00 4d 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f  MAL<<2);.  }.  /
2fe10 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2fe20 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fe30 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2fe40 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2fe50 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2fe60 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2fe70 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2fe80 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2fe90 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2fea0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2feb0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2fec0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2fed0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2fee0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2fef0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2ff00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2ff10 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2ff20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2ff30 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2ff40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2ff50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2ff60 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2ff70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2ff80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ff90 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2ffa0 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2ffb0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2ffc0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2ffd0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2ffe0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2fff0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
30000 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d  it;.  setGetterM
30010 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20  ethod(pPager);. 
30020 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
30030 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
30040 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
30050 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
30060 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
30070 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
30080 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
30090 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
300a0 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
300b0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
300c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
300d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
300e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
300f0 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
30100 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
30110 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
30120 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
30130 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
30140 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
30150 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
30160 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
30170 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
30180 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
30190 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
301a0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
301b0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
301c0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
301d0 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
301e0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
301f0 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
30200 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
30210 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
30220 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
30230 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
30240 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
30250 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
30260 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
30270 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
30280 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30290 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
302a0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
302b0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
302c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
302d0 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
302e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
302f0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
30300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30310 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
30320 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
30330 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
30340 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30350 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
30360 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
30370 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
30380 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
30390 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
303a0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
303b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
303c0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
303d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
303e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
303f0 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
30400 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
30410 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
30420 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
30430 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
30440 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
30450 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
30460 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
30470 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
30480 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
30490 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
304a0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
304b0 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
304c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
304d0 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
304e0 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
304f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
30500 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
30510 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
30520 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30530 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
30540 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
30550 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
30560 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
30570 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
30580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30590 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
305a0 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
305b0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
305c0 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
305d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
305e0 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
305f0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
30600 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
30610 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
30620 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
30630 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
30640 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
30650 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
30660 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
30670 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30680 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
30690 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
306a0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
306b0 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
306c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
306d0 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
306e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
306f0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
30700 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
30710 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
30720 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
30730 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
30740 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
30750 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
30760 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
30770 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
30780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30790 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
307a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
307b0 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
307d0 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
307e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
307f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
30800 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
30810 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
30820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30830 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
30840 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
30850 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
30860 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30870 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30880 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
30890 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
308a0 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
308b0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
308c0 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
308d0 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
308e0 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
308f0 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
30900 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
30910 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30920 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
30930 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
30940 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
30950 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
30960 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
30970 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
30980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
30990 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
309a0 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
309b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
309c0 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
309d0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
309e0 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
309f0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
30a00 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
30a10 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
30a20 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
30a30 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
30a40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
30a50 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
30a60 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
30a70 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
30a80 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
30a90 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
30aa0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
30ab0 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
30ac0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
30ad0 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
30ae0 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
30af0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
30b00 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
30b10 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
30b20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
30b30 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
30b40 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
30b50 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
30b60 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
30b70 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
30b80 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
30b90 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
30ba0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
30bb0 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
30bc0 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
30bd0 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
30be0 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
30bf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
30c00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
30c10 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
30c20 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
30c30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
30c40 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
30c50 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
30c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30c70 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
30c80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30c90 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
30ca0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30cb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
30cc0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
30cd0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
30ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
30cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30d00 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
30d10 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
30d20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
30d30 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
30d40 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
30d50 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
30d60 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
30d70 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
30d80 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
30d90 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
30da0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
30db0 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
30dc0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
30dd0 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
30de0 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
30df0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
30e00 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
30e10 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
30e20 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
30e30 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
30e40 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
30e50 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
30e60 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
30e70 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
30e80 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
30e90 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
30ea0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30eb0 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
30ec0 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
30ed0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
30ee0 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
30ef0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30f00 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
30f10 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
30f20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30f30 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
30f40 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
30f50 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
30f60 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
30f70 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
30f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30f90 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
30fa0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
30fb0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
30fc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
30fd0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
30fe0 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
30ff0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31000 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31020 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
31030 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31050 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
31060 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
31070 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
31080 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
31090 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
310a0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
310b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
310c0 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
310d0 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
310e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
310f0 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
31100 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
31110 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
31120 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
31130 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
31140 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
31150 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
31160 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
31170 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
31180 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
31190 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
311a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
311b0 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
311c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
311d0 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
311e0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
311f0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31200 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
31210 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31220 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31230 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31240 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
31250 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31280 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
31290 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
312a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
312b0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
312c0 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
312d0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
312e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
312f0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
31300 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
31310 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31320 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
31330 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
31340 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31360 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31370 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31390 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
313a0 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
313b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
313c0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
313d0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
313e0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
313f0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
31400 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
31410 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
31420 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
31430 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
31440 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
31450 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
31460 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
31470 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
31480 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31490 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
314a0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
314b0 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
314c0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
314d0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
314e0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
314f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
31500 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
31510 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
31520 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
31530 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
31540 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
31550 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
31560 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
31570 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
31580 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
31590 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
315a0 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
315b0 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
315c0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
315d0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
315e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
315f0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
31600 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
31610 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
31620 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
31630 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
31640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31650 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31660 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31680 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31690 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
316a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
316b0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
316c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
316d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
316e0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
316f0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
31700 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
31710 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
31720 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
31730 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
31740 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
31750 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
31760 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
31770 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31780 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
31790 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
317a0 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
317b0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
317c0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
317d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
317e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
317f0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
31800 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
31810 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
31820 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
31830 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
31840 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
31850 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
31860 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
31870 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31880 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
31890 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
318a0 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
318b0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
318c0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
318d0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
318e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
318f0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
31900 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
31910 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
31920 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
31930 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
31940 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
31950 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
31960 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
31970 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
31980 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
31990 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
319a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
319b0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
319c0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
319d0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
319e0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
319f0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
31a00 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
31a10 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
31a20 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
31a30 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
31a40 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
31a50 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
31a60 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
31a70 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
31a80 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
31a90 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
31aa0 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
31ab0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
31ac0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
31ad0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
31ae0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
31af0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
31b00 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
31b10 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
31b20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
31b30 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
31b40 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
31b50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
31b60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
31b70 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
31b80 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
31b90 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
31ba0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
31bb0 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
31bc0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
31bd0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
31be0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31bf0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
31c00 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
31c10 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
31c20 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
31c30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
31c50 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
31c60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
31c70 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
31c80 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
31c90 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
31ca0 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
31cb0 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
31cc0 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
31cd0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
31ce0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
31cf0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
31d00 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
31d10 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
31d20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
31d30 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
31d40 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
31d50 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
31d60 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
31d70 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
31d80 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
31d90 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
31da0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
31db0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
31dc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31dd0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
31de0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31df0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
31e00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31e10 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
31e20 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  _OK );..  if( !p
31e30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
31e40 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
31e50 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
31e60 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
31e70 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
31e80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
31e90 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
31ea0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
31eb0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
31ec0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
31ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
31ee0 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
31ef0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
31f00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
31f10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
31f20 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
31f30 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31f40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31f60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31f70 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
31f80 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
31f90 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
31fa0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
31fb0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
31fc0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
31fd0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
31fe0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
31ff0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
32000 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
32010 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
32020 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
32030 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
32040 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
32050 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32060 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32070 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32080 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
32090 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
320a0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
320b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
320c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
320d0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
320e0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
320f0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
32100 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
32110 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
32120 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
32130 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
32140 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32150 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32160 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32170 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32180 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
32190 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
321a0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
321b0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
321c0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
321d0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
321e0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
321f0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
32200 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
32210 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
32220 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
32230 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32240 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
32250 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32260 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32270 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32280 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
32290 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
322a0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
322b0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
322c0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
322d0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
322e0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
322f0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
32300 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
32310 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32320 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
32330 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
32340 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
32350 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32360 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32370 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32380 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
32390 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
323a0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
323b0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
323c0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
323d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
323e0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
323f0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
32400 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
32410 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32420 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32430 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32440 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32450 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32470 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32480 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32490 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
324a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
324b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
324c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
324d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
324e0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
324f0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
32500 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
32510 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32520 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32530 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
32540 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
32550 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
32560 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
32570 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
32580 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
32590 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
325a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
325b0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
325c0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
325d0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
325e0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
325f0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
32600 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
32610 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
32620 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
32630 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32640 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
32650 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
32660 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
32670 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
32680 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
32690 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
326a0 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
326b0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
326c0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
326d0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
326e0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
326f0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32700 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
32710 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
32720 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
32730 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
32740 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
32750 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
32760 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
32770 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
32780 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
32790 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
327a0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
327b0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
327c0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
327d0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
327e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
327f0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
32800 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32810 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32820 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32830 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
32840 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
32850 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
32860 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
32870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32880 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
32890 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
328a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
328b0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
328c0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
328d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
328e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
328f0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
32900 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
32920 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
32930 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
32940 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32950 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
32960 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
32970 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
32980 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
32990 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
329a0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
329b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
329c0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
329d0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
329e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
329f0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
32a00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
32a10 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
32a20 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
32a30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
32a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
32a50 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
32a60 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
32a70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32a80 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
32a90 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
32aa0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
32ab0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
32ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32ad0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
32ae0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
32af0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
32b00 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
32b10 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
32b20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
32b30 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
32b40 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
32b50 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
32b60 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
32b70 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
32b80 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
32b90 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
32ba0 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
32bb0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
32bc0 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
32bd0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
32be0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
32bf0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
32c00 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
32c10 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
32c20 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
32c30 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
32c40 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
32c50 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
32c60 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
32c70 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
32c80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
32c90 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
32ca0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
32cb0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
32cc0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
32cd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
32ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
32d00 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
32d10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
32d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32d40 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
32d50 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50  back(pPager, !pP
32d60 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
32d70 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
32d80 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
32d90 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
32da0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
32db0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
32dc0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
32dd0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
32de0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
32df0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
32e00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
32e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
32e30 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
32e40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
32e50 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
32e60 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
32e70 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
32e80 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
32e90 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
32ea0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
32eb0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
32ec0 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
32ed0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
32ee0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32ef0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
32f00 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
32f10 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
32f20 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
32f30 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
32f40 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
32f50 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
32f60 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
32f70 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
32f80 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
32f90 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
32fa0 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
32fb0 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
32fc0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
32fd0 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
32fe0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
32ff0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
33000 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
33010 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
33020 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
33030 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
33040 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
33050 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
33060 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
33070 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
33080 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
33090 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
330a0 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
330b0 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
330c0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
330d0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
330e0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
330f0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
33100 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
33110 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
33120 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
33130 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
33140 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
33150 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
33160 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
33170 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
33180 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
33190 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
331a0 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
331b0 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
331c0 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
331d0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
331e0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
331f0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
33200 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33210 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
33220 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
33230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33240 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33250 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
33260 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
33270 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
33280 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
33290 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
332a0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
332b0 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
332c0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
332d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
332e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
332f0 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48   && pPager->hasH
33300 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b  eldSharedLock ){
33310 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
33320 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
33330 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
33340 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20   then check to. 
33350 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
33360 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
33370 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
33380 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33390 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20  has changed,.   
333a0 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
333b0 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48  cache.  The hasH
333c0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c  eldSharedLock fl
333d0 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  ag prevents this
333e0 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f   from.      ** o
333f0 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20  ccurring on the 
33400 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73  very first acces
33410 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20  s to a file, in 
33420 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a  order to save a.
33430 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
33440 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69  unnecessary sqli
33450 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
33460 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70   at the start-up
33470 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33480 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
33490 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65  nges are detecte
334a0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
334b0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
334c0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
334d0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
334e0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
334f0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
33500 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
33510 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
33520 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
33530 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
33540 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
33550 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
33560 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
33570 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
33580 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
33590 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
335a0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
335b0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
335c0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
335d0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
335e0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
335f0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
33600 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
33610 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
33620 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
33630 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
33640 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
33650 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
33660 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
33670 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
33680 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
33690 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
336a0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
336b0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
336c0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
336d0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
336e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
336f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
33700 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
33710 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33720 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
33730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
33750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
33760 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
33770 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33780 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
33790 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
337a0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
337b0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
337c0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
337d0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
337e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
337f0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
33800 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33810 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
33820 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
33830 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
33840 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
33850 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
33860 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
33870 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
33880 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
33890 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
338a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
338b0 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
338c0 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
338d0 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
338e0 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
338f0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
33900 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
33910 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
33920 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33930 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
33940 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
33950 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
33960 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
33970 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
33980 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
33990 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
339a0 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
339b0 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
339c0 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
339d0 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
339e0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
339f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33a00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
33a10 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
33a20 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
33a30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
33a40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
33a50 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
33a60 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
33a70 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
33a80 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
33a90 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
33aa0 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
33ab0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
33ac0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
33ad0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
33ae0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
33af0 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
33b00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33b10 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
33b20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
33b30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
33b40 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
33b50 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
33b60 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
33b70 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33b80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
33b90 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
33ba0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
33bb0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
33bc0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
33bd0 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  le==0 && pPager-
33be0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
33bf0 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
33c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
33c10 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
33c20 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
33c30 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
33c40 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
33c50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33c60 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
33c70 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
33c80 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
33c90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33ca0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33cb0 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
33cc0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
33cd0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
33ce0 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
33cf0 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
33d00 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ck = 1;.  }.  re
33d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33d20 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
33d30 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
33d40 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
33d50 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
33d60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
33d70 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
33d80 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
33d90 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
33da0 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
33db0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
33dc0 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
33dd0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
33de0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
33df0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
33e00 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
33e10 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
33e20 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
33e30 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
33e40 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
33e50 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
33e60 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
33e70 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  {.  if( sqlite3P
33e80 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
33e90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
33ea0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
33eb0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
33ec0 74 3d 3d 30 20 29 3b 20 2f 2a 20 62 65 63 61 75  t==0 ); /* becau
33ed0 73 65 20 70 61 67 65 31 20 69 73 20 6e 65 76 65  se page1 is neve
33ee0 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  r memory mapped 
33ef0 2a 2f 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  */.    pagerUnlo
33f00 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
33f10 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
33f20 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  .** The page get
33f30 74 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68  ter methods each
33f40 20 74 72 79 20 74 6f 20 61 63 71 75 69 72 65 20   try to acquire 
33f50 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
33f60 0a 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70 61  .** page with pa
33f70 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
33f80 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
33f90 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
33fa0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
33fb0 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
33fc0 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
33fd0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
33fe0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
33ff0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
34000 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
34010 6e 73 20 6f 66 20 74 68 65 20 67 65 74 74 65 72  ns of the getter
34020 20 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e   method dependin
34030 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72  g.** on the curr
34040 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
34050 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   pager..**.**   
34060 20 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28    getPageNormal(
34070 29 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68  )         --  Th
34080 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a  e normal getter.
34090 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 45 72  **     getPageEr
340a0 72 6f 72 28 29 20 20 20 20 20 20 20 20 20 20 2d  ror()          -
340b0 2d 20 20 55 73 65 64 20 69 66 20 74 68 65 20 70  -  Used if the p
340c0 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
340d0 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  ror state.**    
340e0 20 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20   getPageMmap()  
340f0 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65           --  Use
34100 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  d if memory-mapp
34110 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65  ed I/O is enable
34120 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  d.**.** If the r
34130 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
34140 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34150 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
34160 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
34170 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
34180 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
34190 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
341a0 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
341b0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
341c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
341d0 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
341e0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
341f0 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
34200 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
34210 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
34220 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
34230 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
34240 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
34250 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
34260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
34270 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
34280 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
34290 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
342a0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
342b0 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
342c0 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
342d0 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
342e0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
342f0 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
34300 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
34310 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34320 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
34330 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
34340 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
34350 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
34360 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
34370 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
34380 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
34390 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
343a0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
343b0 20 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20   page or if .** 
343c0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
343d0 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ter contains the
343e0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
343f0 54 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65  TENT bit and the
34400 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
34410 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
34420 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
34430 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
34440 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
34450 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
34460 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
34470 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
34480 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
34490 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
344a0 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
344b0 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  f PAGER_GET_NOCO
344c0 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69  NTENT is true, i
344d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
344e0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
344f0 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
34500 73 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  s of the page. T
34510 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
34520 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
34530 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
34540 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
34550 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
34560 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
34570 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
34580 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
34590 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
345a0 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
345b0 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
345c0 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
345d0 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
345e0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
345f0 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
34600 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
34610 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
34620 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f  ** If PAGER_GET_
34630 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75  NOCONTENT is tru
34640 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
34650 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
34660 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  oed instead.** o
34670 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
34680 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
34690 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
346a0 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
346b0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
346c0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
346d0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
346e0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
346f0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
34700 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
34710 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
34720 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
34730 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
34740 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
34750 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
34760 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
34770 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
34780 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
34790 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
347a0 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
347b0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
347c0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
347d0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
347e0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
347f0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
34800 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
34810 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
34820 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
34830 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
34840 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
34850 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
34860 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
34870 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
34880 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
34890 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
348a0 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
348b0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
348c0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
348d0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
348e0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
348f0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
34900 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
34910 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34920 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
34930 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
34940 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
34950 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
34960 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
34970 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
34980 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
34990 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
349a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
349b0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
349c0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
349d0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
349e0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
349f0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
34a00 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
34a10 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
34a20 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
34a30 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
34a40 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
34a50 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iles..*/.static 
34a60 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  int getPageNorma
34a70 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  l(.  Pager *pPag
34a80 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
34a90 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
34aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34ab0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
34ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34ad0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
34ae0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
34af0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
34b00 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
34b10 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
34b20 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
34b30 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
34b40 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
34b50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
34b60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
34b70 72 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43  r *pPg;.  u8 noC
34b80 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
34b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
34ba0 65 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  e if PAGER_GET_N
34bb0 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20  OCONTENT is set 
34bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  */.  sqlite3_pca
34bd0 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b  che_page *pBase;
34be0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
34bf0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
34c00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
34c10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34c20 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
34c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34c40 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34c50 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
34c60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61  sert( pPager->ha
34c70 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d  sHeldSharedLock=
34c80 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  =1 );..  if( pgn
34c90 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
34ca0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34cb0 54 3b 0a 20 20 70 42 61 73 65 20 3d 20 73 71 6c  T;.  pBase = sql
34cc0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
34cd0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34ce0 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 69 66 28   pgno, 3);.  if(
34cf0 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20   pBase==0 ){.   
34d00 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 72 63   pPg = 0;.    rc
34d10 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34d20 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67  FetchStress(pPag
34d30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34d40 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20  o, &pBase);.    
34d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34d60 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
34d70 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34d80 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
34d90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34da0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
34db0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34dc0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34dd0 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 2a 70  }.  }.  pPg = *p
34de0 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
34df0 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
34e00 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34e10 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a  , pgno, pBase);.
34e20 20 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28    assert( pPg==(
34e30 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73  *ppPage) );.  as
34e40 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
34e50 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
34e60 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34e70 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70  pPager || pPg->p
34e80 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 6e  Pager==0 );..  n
34e90 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67  oContent = (flag
34ea0 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  s & PAGER_GET_NO
34eb0 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a 20 20 69  CONTENT)!=0;.  i
34ec0 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26  f( pPg->pPager &
34ed0 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
34ee0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
34ef0 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
34f00 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
34f10 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
34f20 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
34f30 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
34f40 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
34f50 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
34f60 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
34f70 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
34f80 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
34f90 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
34fa0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
34fb0 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a  ER_STAT_HIT]++;.
34fc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34fd0 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
34fe0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
34ff0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
35000 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
35010 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
35020 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
35030 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42 75 74 20  nitialized. But 
35040 66 69 72 73 74 20 73 6f 6d 65 20 65 72 72 6f 72  first some error
35050 20 63 68 65 63 6b 73 3a 0a 20 20 20 20 2a 2a 0a   checks:.    **.
35060 20 20 20 20 2a 2a 20 28 31 29 20 54 68 65 20 6d      ** (1) The m
35070 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
35080 65 72 20 69 73 20 32 5e 33 31 0a 20 20 20 20 2a  er is 2^31.    *
35090 2a 20 28 32 29 20 4e 65 76 65 72 20 74 72 79 20  * (2) Never try 
350a0 74 6f 20 66 65 74 63 68 20 74 68 65 20 6c 6f 63  to fetch the loc
350b0 6b 69 6e 67 20 70 61 67 65 0a 20 20 20 20 2a 2f  king page.    */
350c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
350d0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
350e0 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
350f0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
35100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35120 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
35130 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35140 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   }..    pPg->pPa
35150 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
35160 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
35170 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
35180 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  | !MEMDB );.    
35190 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
351a0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
351b0 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
351c0 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
351d0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
351e0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
351f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35200 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
35210 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
35220 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35230 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
35240 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
35250 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
35260 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
35270 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
35280 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
35290 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
352a0 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
352b0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
352c0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
352d0 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
352e0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
352f0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
35300 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
35310 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
35320 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
35330 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
35340 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
35350 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
35360 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
35370 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
35380 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
35390 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
353a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
353b0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
353c0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
353d0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
353e0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
353f0 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
35400 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
35410 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
35420 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
35430 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
35440 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
35450 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
35460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35470 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
35480 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
35490 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
354a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
354b0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
354c0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
354d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
354e0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
354f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
35500 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
35510 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
35520 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
35530 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
35540 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
35550 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
35560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
35570 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
35580 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  r );.      pPage
35590 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
355a0 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20  TAT_MISS]++;.   
355b0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
355c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
355d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
355e0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
355f0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35600 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
35610 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
35620 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
35630 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
35640 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
35650 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
35660 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
35670 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
35680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
35690 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
356a0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
356b0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
356c0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
356d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
356e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
356f0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54  MMAP_SIZE>0./* T
35700 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20 66  he page getter f
35710 6f 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d  or when memory-m
35720 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61  apped I/O is ena
35730 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69  bled */.static i
35740 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 0a  nt getPageMMap(.
35750 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
35760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
35770 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
35780 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
35790 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
357a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
357b0 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
357c0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
357d0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
357e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
357f0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
35800 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
35810 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
35820 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
35830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35840 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
35850 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
35860 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
35870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
35880 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
35890 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20   WAL file */..  
358a0 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
358b0 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
358c0 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
358d0 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
358e0 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
358f0 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
35900 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
35910 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
35920 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
35930 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
35940 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
35950 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
35960 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
35970 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
35980 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
35990 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
359a0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
359b0 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a  mapOk = (pgno>1.
359c0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
359d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
359e0 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
359f0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
35a00 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73  LY)).  );..  ass
35a10 65 72 74 28 20 55 53 45 46 45 54 43 48 28 70 50  ert( USEFETCH(pP
35a20 61 67 65 72 29 20 29 3b 0a 23 69 66 64 65 66 20  ager) );.#ifdef 
35a30 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
35a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35a50 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a  r->xCodec==0 );.
35a60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74  #endif..  /* Opt
35a70 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  imization note: 
35a80 20 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e   Adding the "pgn
35a90 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72  o<=1" term befor
35aa0 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65  e "pgno==0" here
35ab0 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65  .  ** allows the
35ac0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
35ad0 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65  zer to reuse the
35ae0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
35af0 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65  "pgno>1".  ** te
35b00 73 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  st in the previo
35b10 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e  us statement, an
35b20 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20  d avoid testing 
35b30 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20  pgno==0 in the. 
35b40 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20   ** common case 
35b50 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61  where pgno is la
35b60 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67  rge. */.  if( pg
35b70 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30  no<=1 && pgno==0
35b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
35b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35ba0 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
35bb0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35bc0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
35bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35be0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35bf0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
35c00 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48  rt( pPager->hasH
35c10 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31  eldSharedLock==1
35c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35c30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
35c40 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
35c50 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61  f( bMmapOk && pa
35c60 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35c70 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
35c80 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
35c90 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
35ca0 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
35cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
35cd0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
35ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35cf0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d   }.  }.  if( bMm
35d00 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d  apOk && iFrame==
35d10 30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  0 ){.    void *p
35d20 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 72 63  Data = 0;.    rc
35d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63   = sqlite3OsFetc
35d40 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20  h(pPager->fd, . 
35d50 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
35d60 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
35d70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
35d80 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
35d90 61 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  a.    );.    if(
35da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35db0 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  & pData ){.     
35dc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
35dd0 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52  ate>PAGER_READER
35de0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
35df0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
35e00 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
35e10 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
35e20 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   pgno);.      }.
35e30 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
35e40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35e50 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
35e60 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
35e70 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b  o, pData, &pPg);
35e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
35ea0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
35eb0 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
35ec0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
35ed0 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
35ee0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
35ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
35f00 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
35f10 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  K );.        *pp
35f20 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Page = pPg;.    
35f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35f40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
35f50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
35f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35f70 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
35f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
35fa0 75 72 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  urn getPageNorma
35fb0 6c 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  l(pPager, pgno, 
35fc0 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
35fd0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
35fe0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
35ff0 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70 61  >0 */../* The pa
36000 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
36010 20 66 6f 72 20 77 68 65 6e 20 74 68 65 20 70 61   for when the pa
36020 67 65 72 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ger is an error 
36030 73 74 61 74 65 20 2a 2f 0a 73 74 61 74 69 63 20  state */.static 
36040 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f 72  int getPageError
36050 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
36060 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
36070 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
36080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
36090 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
360a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
360b0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
360c0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
360d0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
360e0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
360f0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
36100 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
36110 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
36120 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
36130 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
36140 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20 55  METER(pgno);.  U
36150 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36160 66 6c 61 67 73 29 3b 0a 20 20 61 73 73 65 72 74  flags);.  assert
36170 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
36180 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
36190 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
361a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
361b0 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20  errCode;.}.../* 
361c0 44 69 73 70 61 74 63 68 20 61 6c 6c 20 70 61 67  Dispatch all pag
361d0 65 20 66 65 74 63 68 20 72 65 71 75 65 73 74 73  e fetch requests
361e0 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
361f0 61 74 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  ate getter metho
36200 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
36210 33 50 61 67 65 72 47 65 74 28 0a 20 20 50 61 67  3PagerGet(.  Pag
36220 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
36230 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
36240 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
36250 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
36260 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
36270 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36280 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
36290 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
362a0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
362b0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
362c0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
362d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
362e0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
362f0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 72 65  flags */.){.  re
36300 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 78 47 65  turn pPager->xGe
36310 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
36320 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
36330 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
36340 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
36350 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
36360 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
36370 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
36380 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
36390 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
363a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
363b0 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
363c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
363d0 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
363e0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
363f0 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
36400 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
36410 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
36420 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
36430 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
36440 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
36450 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
36460 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
36470 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
36480 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36490 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
364a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
364b0 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
364c0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
364d0 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
364e0 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
364f0 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
36500 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
36510 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
36520 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
36530 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c  gno pgno){.  sql
36540 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
36550 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
36560 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
36570 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
36580 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36590 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
365a0 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73  0 );.  pPage = s
365b0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
365c0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
365d0 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61  e, pgno, 0);.  a
365e0 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20  ssert( pPage==0 
365f0 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  || pPager->hasHe
36600 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a  ldSharedLock );.
36610 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29    if( pPage==0 )
36620 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
36630 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
36640 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
36650 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
36660 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  no, pPage);.}../
36670 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
36680 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
36690 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
366a0 50 61 67 65 72 55 6e 72 65 66 28 29 20 61 6e 64  PagerUnref() and
366b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
366c0 65 66 4e 6f 74 4e 75 6c 6c 28 29 20 6d 61 79 20  efNotNull() may 
366d0 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20  only be.** used 
366e0 69 66 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  if we know that 
366f0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 72  the page being r
36700 65 6c 65 61 73 65 64 20 69 73 20 6e 6f 74 20 74  eleased is not t
36710 68 65 20 6c 61 73 74 20 70 61 67 65 2e 0a 2a 2a  he last page..**
36720 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
36730 20 61 6c 77 61 79 73 20 68 6f 6c 64 73 20 70 61   always holds pa
36740 67 65 31 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  ge1 open until t
36750 68 65 20 65 6e 64 2c 20 73 6f 20 74 68 65 73 65  he end, so these
36760 20 66 69 72 73 74 0a 2a 2a 20 74 6f 20 72 6f 75   first.** to rou
36770 74 69 6e 65 73 20 63 61 6e 20 62 65 20 75 73 65  tines can be use
36780 64 20 74 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  d to release any
36790 20 70 61 67 65 20 6f 74 68 65 72 20 74 68 61 6e   page other than
367a0 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
367b0 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73 71 6c 69  ..**.** Use sqli
367c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67  te3PagerUnrefPag
367d0 65 4f 6e 65 28 29 20 74 6f 20 72 65 6c 65 61 73  eOne() to releas
367e0 65 20 70 61 67 65 31 2e 20 20 54 68 69 73 20 6c  e page1.  This l
367f0 61 74 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a  atter routine.**
36800 20 63 68 65 63 6b 73 20 74 68 65 20 74 6f 74 61   checks the tota
36810 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  l number of outs
36820 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 6e  tanding pages an
36830 64 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  d if the number 
36840 6f 66 0a 2a 2a 20 70 61 67 65 73 20 72 65 61 63  of.** pages reac
36850 68 65 73 20 7a 65 72 6f 20 69 74 20 64 72 6f 70  hes zero it drop
36860 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
36870 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
36880 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
36890 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50  tNull(DbPage *pP
368a0 67 29 7b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20  g){.  TESTONLY( 
368b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
368c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 29 0a 20  pPg->pPager; ). 
368d0 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
368e0 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  );.  if( pPg->fl
368f0 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
36900 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
36910 70 50 67 2d 3e 70 67 6e 6f 21 3d 31 20 29 3b 20  pPg->pgno!=1 ); 
36920 20 2f 2a 20 50 61 67 65 31 20 69 73 20 6e 65 76   /* Page1 is nev
36930 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  er memory mapped
36940 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 52 65 6c   */.    pagerRel
36950 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29  easeMapPage(pPg)
36960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
36970 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
36980 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
36990 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 74 68  /* Do not use th
369a0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  is routine to re
369b0 6c 65 61 73 65 20 74 68 65 20 6c 61 73 74 20 72  lease the last r
369c0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
369d0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  1 */.  assert( s
369e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
369f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
36a00 61 63 68 65 29 3e 30 20 29 3b 0a 7d 0a 76 6f 69  ache)>0 );.}.voi
36a10 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
36a20 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
36a30 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71  {.  if( pPg ) sq
36a40 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
36a50 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 76  otNull(pPg);.}.v
36a60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
36a70 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 44 62 50  UnrefPageOne(DbP
36a80 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
36a90 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73  er *pPager;.  as
36aa0 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
36ab0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
36ac0 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  gno==1 );.  asse
36ad0 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20  rt( (pPg->flags 
36ae0 26 20 50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30  & PGHDR_MMAP)==0
36af0 20 29 3b 20 2f 2a 20 50 61 67 65 31 20 69 73 20   ); /* Page1 is 
36b00 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70  never memory map
36b10 70 65 64 20 2a 2f 0a 20 20 70 50 61 67 65 72 20  ped */.  pPager 
36b20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
36b30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
36b40 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61  lease(pPg);.  pa
36b50 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
36b60 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  d(pPager);.}../*
36b70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
36b80 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
36b90 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
36ba0 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
36bb0 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
36bc0 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
36bd0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
36be0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
36bf0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
36c00 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
36c10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
36c20 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
36c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
36c40 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
36c50 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
36c60 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
36c70 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
36c80 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
36c90 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
36ca0 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
36cb0 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
36cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
36cd0 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
36ce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36cf0 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
36d00 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
36d10 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
36d20 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
36d30 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
36d40 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
36d50 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
36d60 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
36d70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
36d80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
36d90 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
36da0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
36db0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
36dc0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
36dd0 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
36de0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
36df0 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
36e00 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
36e10 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
36e20 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
36e30 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
36e40 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
36e50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
36e60 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
36e70 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
36e80 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
36e90 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
36ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
36eb0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
36ec0 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
36ed0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
36ee0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
36ef0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
36f00 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
36f10 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
36f20 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
36f30 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
36f40 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
36f50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36f60 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
36f70 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
36f80 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
36f90 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
36fa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fc0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
36fd0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
36fe0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
36ff0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
37000 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
37010 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
37020 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
37030 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37040 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37050 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
37060 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
37070 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
37080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37090 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
370a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
370b0 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
370c0 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
370d0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
370e0 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
370f0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
37100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
37110 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
37120 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
37130 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
37140 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
37150 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
37160 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
37170 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
37180 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
37190 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
371a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
371b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
371c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
371d0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
371e0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
371f0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
37200 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
37210 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
37220 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
37230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37240 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
37250 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
37260 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
37270 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
37280 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
37290 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
372a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
372b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
372c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
372d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
372e0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
372f0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
37300 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
37310 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
37320 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
37330 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  t flags = SQLITE
37340 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
37350 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
37360 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  TE;.        int 
37370 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  nSpill;..       
37380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
37390 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
373a0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
373b0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
373c0 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
373d0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
373e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69  ;.          nSpi
373f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
37400 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
37410 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
37420 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
37430 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
37440 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
37450 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72       nSpill = jr
37460 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
37470 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
37480 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
37490 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
374a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
374b0 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d  till has the sam
374c0 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64  e name as it did
374d0 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
374e0 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
374f0 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  ly opened. */.  
37500 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62        rc = datab
37510 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61  aseIsUnmoved(pPa
37520 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
37530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
37550 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
37560 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20  Open (.         
37570 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
37580 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
37590 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
375a0 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20   nSpill.        
375b0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
375c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
375d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
375e0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
375f0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
37600 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
37610 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
37620 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
37630 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
37640 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
37650 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
37660 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
37670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37690 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
376a0 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
376b0 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
376c0 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
376d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
376e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
376f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37700 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
37710 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
37720 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
37730 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
37740 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
37750 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
37760 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
37770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37780 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
37790 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
377a0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
377b0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
377c0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
377d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
377e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
377f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37800 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
37810 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
37820 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
37830 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
37840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37850 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
37860 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
37870 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
37880 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
37890 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
378a0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
378b0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
378c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
378d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
378e0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
378f0 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
37900 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
37910 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
37920 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
37930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37940 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
37950 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
37960 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
37970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
37980 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
37990 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
379a0 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
379b0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
379c0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
379d0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
379e0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
379f0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
37a00 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
37a10 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
37a20 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
37a30 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
37a40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
37a50 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
37a60 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
37a70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
37a80 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
37a90 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
37aa0 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
37ab0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
37ac0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
37ad0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
37ae0 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
37af0 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
37b00 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
37b10 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
37b20 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
37b30 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
37b40 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
37b50 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
37b60 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
37b70 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
37b80 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
37b90 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
37ba0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
37bb0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
37bc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
37bd0 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
37be0 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
37bf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37c00 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
37c10 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
37c20 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37c30 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
37c40 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
37c50 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
37c60 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
37c70 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
37c80 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
37c90 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
37ca0 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
37cb0 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
37cc0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
37cd0 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
37ce0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
37cf0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
37d00 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
37d10 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
37d20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
37d30 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
37d40 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
37d50 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
37d60 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
37d70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
37d80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
37d90 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
37da0 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
37db0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37dc0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
37dd0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
37de0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
37df0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
37e00 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
37e10 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
37e20 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
37e30 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
37e40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37e60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37e80 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c  (void)sqlite3Wal
37e90 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
37ea0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
37eb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
37ec0 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
37ed0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
37ee0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
37ef0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
37f00 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
37f10 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
37f20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
37f30 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
37f40 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
37f50 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
37f60 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
37f70 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
37f80 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
37f90 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
37fa0 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
37fb0 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
37fc0 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
37fd0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
37fe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
37ff0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
38000 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
38010 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
38020 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
38030 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
38040 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
38050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
38060 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
38070 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
38080 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
38090 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
380a0 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
380b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
380c0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
380d0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
380e0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
380f0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
38100 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
38110 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
38120 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
38130 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
38140 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
38150 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
38160 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
38170 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
38180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
38190 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
381a0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
381b0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
381c0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
381d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
381e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
381f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
38210 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
38220 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
38230 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
38240 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
38250 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
38260 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
38270 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
38280 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
38290 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
382a0 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
382b0 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
382c0 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
382d0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
382e0 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
382f0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
38300 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
38310 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
38320 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
38330 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
38340 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
38350 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
38360 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
38370 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
38380 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
38390 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
383a0 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
383b0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
383c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
383d0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
383e0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
383f0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
38400 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
38410 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
38420 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
38430 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
38440 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
38450 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
38460 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
38470 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
38480 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
38490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
384a0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
384b0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
384c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
384d0 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
384e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
384f0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
38500 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38510 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
38520 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
38530 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
38540 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
38550 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
38560 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
38570 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
38580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38590 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20 70  .** Write page p
385a0 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  Pg onto the end 
385b0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
385c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
385d0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
385e0 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64 64 50  NE int pagerAddP
385f0 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75  ageToRollbackJou
38600 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
38610 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
38620 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
38630 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
38640 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a   cksum;.  char *
38650 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69 4f  pData2;.  i64 iO
38660 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
38670 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
38680 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
38690 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
386a0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
386b0 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74  e that.  ** cont
386c0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
386d0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
386e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
386f0 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 61  eri