/ Hex Artifact Content
Login

Artifact d82c877615ead80deccac6c7c59f7a875d7e3d7f1ff5652bbc74503d0e05f6d0:


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 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
7c60: 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20 2a 70  RENT.  Bitvec *p
7c70: 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20 20 20  AllRead;        
7c80: 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65 61 64     /* Pages read
7c90: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
7ca0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
7cb0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 71  . */.#endif.  sq
7cc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
7cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7ce0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7cf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
7d00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
7d20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7d30: 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  r main journal *
7d40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7d50: 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20   *sjfd;         
7d60: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7d70: 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  or for sub-journ
7d80: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  al */.  i64 jour
7d90: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
7da0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77      /* Current w
7db0: 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  rite offset in t
7dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7dd0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
7de0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
7df0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
7e00: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
7e10: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
7e20: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
7e30: 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50  pBackup;    /* P
7e40: 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f  ointer to list o
7e50: 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70  f ongoing backup
7e60: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
7e70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7e80: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7e90: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7ea0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7eb0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ed0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
7ee0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
7ef0: 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61 56   */.  u32 iDataV
7f00: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
7f10: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7f20: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 63  never database c
7f30: 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20 2a  ontent changes *
7f40: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7f50: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7f60: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7f70: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7f80: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20  e changes */..  
7f90: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7fb0: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7fc0: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7fd0: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7fe0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ff0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
8000: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
8010: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
8020: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
8030: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
8040: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
8050: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
8060: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
8070: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
8080: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
8090: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
80f0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8110: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
8120: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
8130: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
8140: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8160: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8170: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8180: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8190: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
81b0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
81c0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
81d0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
81f0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
8200: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
8210: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
8220: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8240: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8250: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8270: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8280: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8290: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
82a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
82b0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
82c0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
82d0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
82e0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
82f0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
8300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8320: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
8330: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
8340: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8360: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8370: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8380: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8390: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
83a0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
83b0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
83c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
83d0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
83e0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
83f0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8400: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8410: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8420: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8440: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8470: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8480: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8490: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
84a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
84b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
84c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ing pages */.  i
84d0: 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65 72  nt (*xGet)(Pager
84e0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
84f0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
8500: 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74 63   to fetch a patc
8510: 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  h */.#ifdef SQLI
8520: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
8530: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
8540: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
8550: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
8560: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
8570: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
8580: 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
8590: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
85a0: 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70  ; /* Notify of p
85b0: 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73  age size changes
85c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
85d0: 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b  decFree)(void*);
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85f0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
8600: 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f  he codec */.  vo
8610: 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20  id *pCodec;     
8620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
8630: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
8640: 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73  Codec... methods
8650: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
8660: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
8670: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8680: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
8690: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
86a0: 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68  p use */.  PCach
86b0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
86c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
86d0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
86e0: 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65  object */.#ifnde
86f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
8700: 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20  L.  Wal *pWal;  
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c  /* Write-ahead l
8730: 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72  og used by "jour
8740: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f  nal_mode=wal" */
8750: 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20  .  char *zWal;  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8770: 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  * File name for 
8780: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
8790: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
87a0: 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20  .** Indexes for 
87b0: 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e 61  use with Pager.a
87c0: 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65  Stat[]. The Page
87d0: 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20  r.aStat[] array 
87e0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
87f0: 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20  values accessed 
8800: 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54  by passing SQLIT
8810: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
8820: 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53  _HIT, CACHE_MISS
8830: 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52   .** or CACHE_WR
8840: 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64  ITE to sqlite3_d
8850: 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23  b_status()..*/.#
8860: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
8870: 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e  T_HIT   0.#defin
8880: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  e PAGER_STAT_MIS
8890: 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47  S  1.#define PAG
88a0: 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a  ER_STAT_WRITE 2.
88b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
88c0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
88d0: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
88e0: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
88f0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
8900: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
8910: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
8920: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
8930: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
8940: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8950: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
8960: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
8970: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
8980: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
8990: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
89a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
89b0: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
89c0: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
89d0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
89e0: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
89f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8a00: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
8a10: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
8a20: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
8a30: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
8a40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8a50: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8a60: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66  journal */.# def
8a70: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8a80: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
8a90: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8aa0: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
8ab0: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
8ac0: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
8ad0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
8ae0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
8af0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
8b00: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
8b10: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
8b20: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
8b30: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
8b40: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
8b50: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
8b60: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
8b70: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
8b80: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
8b90: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
8ba0: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
8bb0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
8bc0: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69   is being.** wri
8bd0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
8be0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
8bf0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
8c00: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
8c10: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
8c20: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
8c30: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
8c40: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
8c50: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
8c60: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
8c70: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
8c80: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
8c90: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
8ca0: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
8cb0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
8cc0: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
8cd0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
8ce0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
8cf0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
8d00: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
8d10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
8d20: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
8d30: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
8d40: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
8d50: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
8d60: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
8d70: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
8d80: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
8da0: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
8db0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
8dc0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
8dd0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
8de0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8df0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
8e00: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
8e10: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
8e20: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
8e30: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
8e40: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
8e50: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
8e60: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
8e70: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
8e80: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
8e90: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
8ea0: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
8eb0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
8ec0: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
8ed0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
8ee0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
8ef0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
8f00: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
8f10: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
8f20: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
8f30: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
8f40: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
8f50: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
8f60: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8f70: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
8f80: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
8f90: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
8fa0: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
8fb0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
8fc0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
8fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
8fe0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
8ff0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
9000: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
9010: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
9020: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
9030: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66  e size of the of
9040: 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72   each page recor
9050: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
9060: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
9070: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
9080: 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  cro..*/.#define 
9090: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
90a0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
90b0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
90c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
90d0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
90e0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  or this pager. T
90f0: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74  his is usually t
9100: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65  he same .** size
9110: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73   as a single dis
9120: 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c  k sector. See al
9130: 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  so setSectorSize
9140: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ()..*/.#define J
9150: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9160: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
9170: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
9180: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
9190: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
91a0: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
91b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
91c0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
91d0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
91e0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
91f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
9200: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
9210: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
9220: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
9230: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
9240: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
9250: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
9260: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
9270: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
9280: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
9290: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
92a0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
92b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
92c0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
92d0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
92e0: 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46  * The macro USEF
92f0: 45 54 43 48 20 69 73 20 74 72 75 65 20 69 66 20  ETCH is true if 
9300: 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  we are allowed t
9310: 6f 20 75 73 65 20 74 68 65 20 78 46 65 74 63 68  o use the xFetch
9320: 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a   and xUnfetch.**
9330: 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61   interfaces to a
9340: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
9350: 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d  se using memory-
9360: 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23  mapped I/O..*/.#
9370: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
9380: 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69  AP_SIZE>0.# defi
9390: 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20 28  ne USEFETCH(x) (
93a0: 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a  (x)->bUseFetch).
93b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
93c0: 53 45 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e  SEFETCH(x) 0.#en
93d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
93e0: 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67  aximum legal pag
93f0: 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33  e number is (2^3
9400: 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69  1 - 1)..*/.#defi
9410: 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  ne PAGER_MAX_PGN
9420: 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a  O 2147483647../*
9430: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
9440: 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
9450: 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  s a file descrip
9460: 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65  tor (type sqlite
9470: 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74  3_file*)..** Ret
9480: 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e  urn 0 if it is n
9490: 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d  ot open, or non-
94a0: 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29  zero (but not 1)
94b0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
94c0: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
94d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
94e0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a   be written as:.
94f0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70  **.**   if( isOp
9500: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
9510: 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73  ){ ....**.** ins
9520: 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20  tead of.**.**   
9530: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d  if( pPager->jfd-
9540: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e  >pMethods ){ ...
9550: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70  .*/.#define isOp
9560: 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e  en(pFd) ((pFd)->
9570: 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a  pMethods!=0)../*
9580: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
9590: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
95a0: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
95b0: 20 6c 6f 67 20 74 6f 20 72 65 61 64 20 70 61 67   log to read pag
95c0: 65 20 70 67 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72  e pgno..** Retur
95d0: 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70  n false if the p
95e0: 61 67 65 72 20 72 65 61 64 73 20 70 67 6e 6f 20  ager reads pgno 
95f0: 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
9600: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 23  e database..*/.#
9610: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9620: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 26 26 20  TE_OMIT_WAL) && 
9630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
9640: 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
9650: 45 41 44 29 0a 69 6e 74 20 73 71 6c 69 74 65 33  EAD).int sqlite3
9660: 50 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  PagerUseWal(Page
9670: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
9680: 70 67 6e 6f 29 7b 0a 20 20 75 33 32 20 69 52 65  pgno){.  u32 iRe
9690: 61 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ad = 0;.  int rc
96a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
96b0: 70 57 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  pWal==0 ) return
96c0: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
96d0: 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
96e0: 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
96f0: 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20 72 65  o, &iRead);.  re
9700: 74 75 72 6e 20 72 63 20 7c 7c 20 69 52 65 61 64  turn rc || iRead
9710: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  ;.}.#endif.#ifnd
9720: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
9730: 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  AL.# define page
9740: 72 55 73 65 57 61 6c 28 78 29 20 28 28 78 29 2d  rUseWal(x) ((x)-
9750: 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65 0a  >pWal!=0).#else.
9760: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73  # define pagerUs
9770: 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  eWal(x) 0.# defi
9780: 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  ne pagerRollback
9790: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
97a0: 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  e pagerWalFrames
97b0: 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65  (v,w,x,y) 0.# de
97c0: 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61  fine pagerOpenWa
97d0: 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51  lIfPresent(z) SQ
97e0: 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65  LITE_OK.# define
97f0: 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
9800: 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51  ransaction(z) SQ
9810: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
9820: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
9830: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
9840: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
9850: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9860: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a  pPager) );.**.**
9870: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9880: 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73  uns many asserts
9890: 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20   to try to find 
98a0: 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20  inconsistencies 
98b0: 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  in.** the intern
98c0: 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
98d0: 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Pager object..*/
98e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65  .static int asse
98f0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50  rt_pager_state(P
9900: 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65  ager *p){.  Page
9910: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a  r *pPager = p;..
9920: 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20    /* State must 
9930: 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61  be valid. */.  a
9940: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
9950: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20  ==PAGER_OPEN.   
9960: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9970: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20  ==PAGER_READER. 
9980: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9990: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
99a0: 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
99b0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
99c0: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
99d0: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
99e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
99f0: 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20  ITER_DBMOD.     
9a00: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9a10: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
9a20: 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  ISHED.       || 
9a30: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9a40: 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f  _ERROR.  );..  /
9a50: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
9a60: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
9a70: 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63  e, a temp-file c
9a80: 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73  onnection always
9a90: 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73   behaves.  ** as
9aa0: 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78   if it has an ex
9ab0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
9ac0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9ad0: 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61  e. It never upda
9ae0: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61  tes.  ** the cha
9af0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
9b00: 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65  d, so the change
9b10: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
9b20: 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20  s always set..  
9b30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9b40: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
9b50: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
9b60: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  VE_LOCK );.  ass
9b70: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9b80: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  ==0 || pPager->c
9b90: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
9ba0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
9bb0: 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69  seJournal flag i
9bc0: 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75  s clear, the jou
9bd0: 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62  rnal-mode must b
9be0: 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41  e "OFF". .  ** A
9bf0: 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd if the journa
9c00: 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c  l-mode is "OFF",
9c10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9c20: 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70  e must not be op
9c30: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  en..  */.  asser
9c40: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9c50: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9c60: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75  MODE_OFF || p->u
9c70: 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
9c80: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c90: 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
9ca0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
9cb0: 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20  !isOpen(p->jfd) 
9cc0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
9cd0: 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65  hat MEMDB implie
9ce0: 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e  s noSync. And an
9cf0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9d00: 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20  al. Since .  ** 
9d10: 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e  this means an in
9d20: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65  -memory pager pe
9d30: 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20  rforms no IO at 
9d40: 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65  all, it cannot e
9d50: 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65  ncounter .  ** e
9d60: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45  ither SQLITE_IOE
9d70: 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  RR or SQLITE_FUL
9d80: 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  L during rollbac
9d90: 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c  k or while final
9da0: 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f  izing .  ** a jo
9db0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74  urnal file. (alt
9dc0: 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d  hough the in-mem
9dd0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c  ory journal impl
9de0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a  ementation may .
9df0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
9e00: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77  TE_IOERR_NOMEM w
9e10: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
9e20: 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77   file is being w
9e30: 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a  ritten). It .  *
9e40: 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e  * is therefore n
9e50: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
9e60: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9e70: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
9e80: 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74  ERROR .  ** stat
9e90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  e..  */.  if( ME
9ea0: 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72  MDB ){.    asser
9eb0: 74 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64  t( !isOpen(p->fd
9ec0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9ed0: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9ee0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9ef0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9f00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9f10: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
9f20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f30: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9f40: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
9f50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
9f60: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9f70: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9f80: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9f90: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9fa0: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9fb0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9fc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9fd0: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9fe0: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9ff0: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
a000: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
a010: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
a020: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
a030: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
a040: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a050: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
a060: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
a070: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
a080: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
a090: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
a0a0: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
a0b0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
a0c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a0f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a100: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a110: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a120: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
a130: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
a140: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a150: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
a160: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
a170: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a1a0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
a1b0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a1c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
a1d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a1e0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a1f0: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a200: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a240: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a260: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
a270: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
a280: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
a2a0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
a2b0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
a2c0: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
a2d0: 54 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  T.      assert( 
a2e0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
a2f0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a300: 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41  ze || pPager->pA
a310: 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66  llRead );.#endif
a320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a330: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a340: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a350: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a360: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a370: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a380: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a3a0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a3b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a3c0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a3d0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a3e0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a3f0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a400: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a410: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a420: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a430: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a440: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a450: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a460: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a470: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a480: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a490: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a4a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a4b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a4c0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a4d0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a4e0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a4f0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a500: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a510: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a520: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a530: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a540: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a550: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a560: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a570: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a580: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a590: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a5a0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a5b0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a5c0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a5d0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a5e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a5f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a600: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a610: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a630: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a640: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a650: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a670: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a680: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a690: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a6a0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a6b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a6c0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a6d0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a6e0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a6f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a700: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a710: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a720: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a730: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a740: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a750: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a760: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a770: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a780: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a7a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a7b0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a7c0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a7d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a7e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a7f0: 0a 20 20 20 20 20 20 29 3b 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 3c 3d 70 50 61 67  dbOrigSize<=pPag
a820: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a830: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a840: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a850: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a870: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a880: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a890: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a8a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a8b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a8c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a8d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a8e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a8f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a900: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a910: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a920: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a930: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a940: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a950: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a960: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a970: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a980: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a990: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a9a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a9b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a9c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a9d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a9e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a9f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
aa00: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
aa10: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
aa20: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
aa30: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
aa40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
aa50: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
aa60: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
aa70: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
aa80: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
aa90: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
aaa0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
aab0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
aac0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aad0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
aae0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
aaf0: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
ab00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ab10: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
ab20: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
ab30: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
ab40: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
ab50: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
ab60: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
ab70: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
ab80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
ab90: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
aba0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
abb0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
abc0: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
abd0: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
abe0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
abf0: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
ac00: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
ac10: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
ac20: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
ac30: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
ac40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
ac50: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
ac60: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
ac70: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
ac80: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
ac90: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
aca0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
acb0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
acc0: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
acd0: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
ace0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
acf0: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
ad00: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
ad10: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ad20: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ad30: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ad40: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
ad50: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
ad60: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
ad70: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
ad80: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ad90: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ada0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
adb0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
adc0: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
add0: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
ade0: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
adf0: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
ae00: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
ae10: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ae20: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ae30: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ae40: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ae50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ae60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
ae70: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
ae80: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ae90: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
aea0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
aeb0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
aec0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aed0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
aee0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
aef0: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
af00: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af10: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
af20: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
af30: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
af40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
af50: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
af60: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
af70: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
af90: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
afa0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
afb0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
afc0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
afd0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
afe0: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
aff0: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
b000: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
b010: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
b020: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
b030: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
b040: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
b050: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
b060: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
b070: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
b080: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
b090: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
b0a0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
b0b0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
b0c0: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
b0d0: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
b0e0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
b0f0: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
b100: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
b110: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b120: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
b130: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
b140: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
b150: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b160: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
b170: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
b180: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b190: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b1a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
b1b0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
b1c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b1d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b1e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
b1f0: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
b200: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b210: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b220: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b230: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b240: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b250: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b260: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b270: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b280: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b290: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b2a0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b2b0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b2c0: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b2d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b2e0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b2f0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b300: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b310: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b320: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b330: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b340: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  .}.#endif../* Fo
b350: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
b360: 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
b370: 70 61 67 65 20 67 65 74 74 65 72 73 20 2a 2f 0a  page getters */.
b380: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
b390: 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72 2a 2c  geNormal(Pager*,
b3a0: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b3b0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 67  t);.static int g
b3c0: 65 74 50 61 67 65 45 72 72 6f 72 28 50 61 67 65  etPageError(Page
b3d0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b3e0: 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c 49 54  ,int);.#if SQLIT
b3f0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b400: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  0.static int get
b410: 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72 2a 2c  PageMMap(Pager*,
b420: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b430: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t);.#endif../*.*
b440: 2a 20 53 65 74 20 74 68 65 20 50 61 67 65 72 2e  * Set the Pager.
b450: 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f 72 20  xGet method for 
b460: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b470: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
b480: 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65 6e 74  fetch.** content
b490: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
b4a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b4b0: 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
b4c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b4d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b4e0: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70 50 61  rCode ){.    pPa
b4f0: 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50  ger->xGet = getP
b500: 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20 53 51  ageError;.#if SQ
b510: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b520: 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69 66 28  ZE>0.  }else if(
b530: 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
b540: 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
b550: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
b560: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
b570: 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  0.#endif.  ){.  
b580: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b590: 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23 65   getPageMMap;.#e
b5a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
b5b0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
b5c0: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
b5d0: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b5e0: 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20 7d  tPageNormal;.  }
b5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b600: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b610: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b620: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b630: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b640: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b650: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b660: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b670: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b680: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b690: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b6a0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b6b0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b6c0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b6d0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b6e0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b6f0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b700: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b710: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b720: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b730: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b740: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b750: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b760: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b770: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b780: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b790: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b7a0: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b7b0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b7c0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b7d0: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b7e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b7f0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b800: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b810: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b820: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b830: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b840: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b850: 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e  cTestNotNull(p->
b860: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b870: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b880: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b8a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b8b0: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
b8c0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
b8d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
b8e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b8f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b900: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 61  pageInJournal(Pa
b910: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
b920: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b930: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b940: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
b950: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
b960: 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  no);.}.#endif../
b970: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
b980: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
b990: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b9a0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
b9b0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
b9c0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
b9d0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
b9e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
b9f0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
ba00: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
ba10: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
ba20: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
ba30: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
ba40: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
ba50: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
ba60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
ba70: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
ba80: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
ba90: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
baa0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bab0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
bac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
bad0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
bae0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
baf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bb00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
bb10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
bb20: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
bb30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bb40: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
bb50: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
bb60: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
bb70: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
bb80: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
bb90: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
bba0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
bbb0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
bbc0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bbd0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bbe0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bbf0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
bc00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
bc10: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
bc20: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
bc30: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
bc40: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
bc50: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
bc60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bc70: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bc80: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
bc90: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
bca0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
bcb0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
bcc0: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
bcd0: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
bce0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bcf0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
bd00: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
bd10: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
bd20: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
bd30: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
bd40: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
bd50: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
bd60: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
bd70: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
bd80: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
bd90: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
bda0: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
bdb0: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
bdc0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bdd0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bde0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bdf0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
be00: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
be10: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
be20: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
be30: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
be40: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
be50: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
be60: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
be70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
be80: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
be90: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
bea0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
beb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bec0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
bed0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
bee0: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
bef0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
bf00: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
bf10: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bf20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
bf30: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
bf40: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bf50: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
bf60: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
bf70: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
bf80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
bf90: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
bfa0: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50  k );.    rc = pP
bfb0: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bfc0: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bfd0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
bfe0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
bff0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c000: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c010: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
c020: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c030: 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eLock;.    }.   
c040: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
c050: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c060: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a  er, eLock)).  }.
c070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c080: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64  /*.** Lock the d
c090: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
c0a0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c0b0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c0c0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a  r SHARED_LOCK,.*
c0d0: 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  * RESERVED_LOCK 
c0e0: 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
c0f0: 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  K. If the caller
c100: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
c110: 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  set the.** Pager
c120: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
c130: 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  to the new locki
c140: 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  ng state. .**.**
c150: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
c160: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
c170: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
c180: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c190: 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c  n is .** called,
c1a0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c1b0: 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77  t unless the new
c1c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69   locking state i
c1d0: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
c1e0: 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f  . .** See the co
c1f0: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
c200: 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f  #define of UNKNO
c210: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
c220: 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f  xplanation .** o
c230: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
c240: 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44  c int pagerLockD
c250: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c260: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c270: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c280: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c  K;..  assert( eL
c290: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c2a0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   || eLock==RESER
c2b0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  VED_LOCK || eLoc
c2c0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c2d0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
c2e0: 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c  r->eLock<eLock |
c2f0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
c300: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
c310: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
c320: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
c330: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
c340: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
c350: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
c360: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c370: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
c380: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
c390: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c3a0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
c3b0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
c3c0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
c3d0: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
c3e0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
c3f0: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
c400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c420: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
c430: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
c440: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
c450: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
c460: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
c470: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
c480: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
c490: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c4a0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c4b0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c4c0: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c4d0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c4e0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c4f0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c500: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c510: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c520: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c530: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c540: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c550: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c560: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c570: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c580: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
c590: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
c5a0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
c5b0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
c5c0: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
c5d0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
c5e0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
c5f0: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
c600: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
c610: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
c620: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
c630: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
c640: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
c650: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
c660: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
c670: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c680: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
c690: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c6a0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
c6b0: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
c6c0: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
c6d0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
c6e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c6f0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
c700: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
c710: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
c720: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c730: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
c740: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
c750: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
c760: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c780: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
c790: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
c7a0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
c7d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
c7e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
c800: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
c810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c820: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
c830: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
c840: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c850: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
c860: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
c870: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c880: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
c890: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c8a0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
c8b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c8c0: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
c8d0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c8e0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
c8f0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
c900: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
c910: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c920: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
c930: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
c940: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
c950: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
c960: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
c970: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c980: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
c990: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
c9a0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 72 6e  lse.# define jrn
c9b0: 6c 42 75 66 66 65 72 53 69 7a 65 28 78 29 20 30  lBufferSize(x) 0
c9c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c9d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c9e0: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
c9f0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
ca00: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
ca10: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
ca20: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
ca30: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
ca40: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
ca50: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
ca60: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
ca70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ca80: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
ca90: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
caa0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
cab0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
cac0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
cad0: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
cae0: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
caf0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
cb00: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
cb10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
cb20: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
cb30: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
cb40: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
cb50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
cb60: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
cb70: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cb80: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
cb90: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
cba0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
cbb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
cbc0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
cbd0: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
cbe0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
cbf0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
cc00: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
cc10: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
cc20: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
cc30: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
cc40: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
cc50: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
cc60: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
cc70: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
cc80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
cc90: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
cca0: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
ccb0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
ccc0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
ccd0: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
cce0: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
ccf0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
cd00: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
cd10: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
cd20: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
cd30: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
cd40: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
cd50: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
cd60: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
cd70: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
cd80: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
cd90: 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
cda0: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
cdb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
cdc0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
cdd0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
cde0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
cdf0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
ce00: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
ce10: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
ce20: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
ce30: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
ce40: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
ce50: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29  _set_pagehash(X)
ce60: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
ce70: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
ce80: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
ce90: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
cea0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ceb0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
cec0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
ced0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
cee0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
cef0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
cf00: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
cf10: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cf20: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
cf30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
cf40: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
cf50: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
cf60: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
cf70: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
cf80: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
cf90: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
cfa0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
cfb0: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
cfc0: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
cfd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cfe0: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
cff0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
d000: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
d010: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
d020: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
d030: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
d040: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
d050: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
d060: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
d070: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
d080: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
d090: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
d0a0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
d0b0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
d0c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
d0d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d0e0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
d0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
d100: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
d110: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
d120: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
d130: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
d140: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
d150: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
d160: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
d170: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
d180: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d190: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
d1a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d1b0: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
d1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
d1d0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
d1e0: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
d1f0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
d200: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
d210: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
d220: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
d230: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
d240: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
d250: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
d260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d270: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
d280: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
d290: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
d2a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d2b0: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
d2c0: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
d2d0: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
d2e0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
d2f0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d300: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
d310: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
d320: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
d330: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
d340: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
d350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d360: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
d370: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
d380: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
d390: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
d3a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3c0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d3d0: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
d400: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
d410: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
d420: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
d430: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
d440: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
d450: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
d460: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
d470: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
d480: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
d490: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
d4a0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
d4b0: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d4d0: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
d4e0: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
d4f0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
d500: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
d510: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
d520: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
d530: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
d540: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
d550: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d560: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
d570: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
d580: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
d590: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d5a0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d5b0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
d5c0: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
d5d0: 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  r .   || len==0 
d5e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d5f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d600: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
d610: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
d620: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d630: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d640: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
d650: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
d660: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
d670: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
d680: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d690: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d6a0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
d6b0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
d6c0: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
d6d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d6e0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
d6f0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
d700: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d710: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
d720: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
d730: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
d740: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
d750: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
d760: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
d770: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
d780: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
d790: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
d7a0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
d7b0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
d7c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d7d0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
d7e0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
d7f0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
d800: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
d810: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d820: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
d830: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
d840: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d850: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
d860: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
d870: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
d880: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
d890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d8b0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
d8c0: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
d8d0: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
d8e0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d8f0: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d900: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d910: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d920: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d930: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d940: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d950: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d960: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d970: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d980: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d990: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d9a0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d9d0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d9f0: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
da10: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
da60: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
da70: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
da80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
da90: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
daa0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
dab0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
dac0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
dad0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
dae0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
daf0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
db00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
db10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
db20: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
db30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
db40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
db50: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
db60: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
db70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
db80: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
db90: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
dba0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
dbb0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
dbc0: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
dbd0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
dbe0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
dbf0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
dc00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
dc10: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
dc20: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
dc30: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
dc40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
dc50: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
dc60: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
dc70: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
dc80: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
dc90: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
dca0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
dcb0: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
dcc0: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
dcd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dce0: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
dcf0: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
dd00: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
dd10: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
dd20: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
dd30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
dd40: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
dd50: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
dd60: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
dd70: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
dd80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dd90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
dda0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
ddb0: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
ddc0: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
ddd0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
dde0: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
ddf0: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
de00: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
de10: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
de20: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
de30: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
de40: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
de50: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
de60: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
de70: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
de80: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
de90: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
dea0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
deb0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
dec0: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
ded0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
dee0: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
def0: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
df00: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
df10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
df20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
df30: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
df40: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
df50: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
df60: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
df70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
df80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
df90: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
dfa0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
dfb0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
dfc0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dfd0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e000: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e010: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
e030: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
e040: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
e050: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
e060: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e070: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
e080: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
e090: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
e0a0: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
e0b0: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
e0c0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
e0d0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
e0e0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
e0f0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
e100: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
e110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e120: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e130: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
e140: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
e150: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
e160: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
e170: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e180: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e190: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
e1a0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
e1b0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
e1c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e1d0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
e1e0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
e1f0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e200: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
e210: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
e220: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
e230: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
e240: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e250: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
e260: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
e270: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
e280: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
e290: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
e2a0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
e2b0: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
e2c0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
e2d0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
e2e0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e2f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e300: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
e310: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
e320: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
e330: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
e340: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
e350: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
e360: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
e370: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
e380: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
e390: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e3a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e3b0: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
e3c0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
e3d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e3e0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
e3f0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
e400: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e410: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
e420: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
e430: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e440: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e450: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
e460: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e480: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
e490: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
e4a0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
e4b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
e4c0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
e4d0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
e4e0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
e4f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e500: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
e510: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
e520: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
e530: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
e540: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e550: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
e560: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
e570: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
e580: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
e590: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
e5a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
e5b0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
e5c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
e5d0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
e5e0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
e5f0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
e600: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
e610: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
e620: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
e630: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
e640: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
e650: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
e660: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
e670: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
e680: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
e690: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
e6a0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
e6b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e6c0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
e6d0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
e6e0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
e6f0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
e700: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
e710: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e730: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e740: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
e750: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e760: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
e770: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
e780: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
e790: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
e7a0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
e7b0: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
e7c0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
e7d0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
e7e0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e810: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
e820: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
e830: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e860: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e870: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e880: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e890: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e8a0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e8b0: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
e8c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e8d0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
e8e0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
e8f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
e900: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e910: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
e920: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
e930: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
e940: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
e950: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
e960: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
e970: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
e980: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
e990: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
e9a0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
e9b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
e9c0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
e9d0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
e9e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e9f0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
ea00: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
ea10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
ea20: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ea30: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
ea40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
ea50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
ea60: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
ea70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ea80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
ea90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
eaa0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
eab0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
eac0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
ead0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
eae0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
eaf0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
eb00: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
eb10: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
eb20: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
eb30: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
eb40: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
eb50: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
eb60: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
eb70: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
eb80: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
eb90: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
eba0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
ebb0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
ebc0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
ebd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
ebe0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
ebf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
ec00: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
ec10: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
ec20: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
ec30: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
ec40: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
ec50: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
ec60: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
ec70: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
ec80: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
ec90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eca0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
ecb0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
ecc0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
ecd0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
ece0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
ecf0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
ed00: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
ed10: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
ed20: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
ed30: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
ed40: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
ed50: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
ed60: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
ed70: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
ed80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
ed90: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
eda0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
edb0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
edc0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
edd0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
ede0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
edf0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
ee00: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
ee10: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ee20: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
ee30: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
ee40: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
ee50: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
ee60: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
ee70: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ee80: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
ee90: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
eea0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
eeb0: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
eec0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
eed0: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
eee0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
eef0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ef00: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
ef10: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ef20: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
ef30: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
ef40: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
ef50: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
ef60: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
ef70: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
ef80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
ef90: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
efa0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
efb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
efc0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
efd0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
efe0: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
eff0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f000: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
f010: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
f020: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
f030: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
f040: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f050: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
f060: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
f070: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
f080: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
f090: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f0a0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
f0b0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f0c0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
f0d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
f0e0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f0f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f100: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
f110: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
f120: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
f130: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
f140: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
f150: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
f160: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f170: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f180: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
f190: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
f1a0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
f1b0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f1c0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f1d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
f1e0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f1f0: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
f200: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
f210: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
f220: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
f230: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
f240: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
f250: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
f260: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
f270: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
f280: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
f290: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
f2a0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
f2b0: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
f2c0: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
f2d0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
f2e0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
f2f0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
f300: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f310: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
f320: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
f330: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
f340: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
f350: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
f360: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
f370: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
f380: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
f390: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
f3a0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
f3b0: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
f3c0: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
f3d0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
f3e0: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
f3f0: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
f400: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
f410: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
f420: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
f430: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
f440: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
f450: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
f460: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
f470: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
f480: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
f490: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
f4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
f4b0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
f4c0: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
f4d0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
f4e0: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
f4f0: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
f500: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
f510: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
f520: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f530: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
f540: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
f550: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
f560: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f570: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
f580: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
f590: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
f5a0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
f5b0: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
f5c0: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
f5d0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
f5e0: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
f5f0: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
f600: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
f610: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
f620: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
f630: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
f640: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
f650: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
f660: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
f670: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
f680: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
f690: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
f6a0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
f6b0: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
f6c0: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
f6d0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f6e0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
f6f0: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
f700: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
f710: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
f720: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
f730: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
f740: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
f750: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
f760: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
f770: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
f780: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
f790: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f7a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
f7b0: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
f7c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f7d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f7e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f7f0: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
f800: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
f810: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f820: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
f830: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f840: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
f850: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f860: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
f870: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
f880: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f890: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
f8a0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
f8b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
f8c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f8d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
f8e0: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
f8f0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f900: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f910: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
f920: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f930: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
f940: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
f950: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
f960: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
f970: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
f980: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
f990: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
f9a0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
f9b0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
f9c0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
f9d0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
f9e0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
f9f0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
fa00: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
fa10: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
fa20: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
fa30: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
fa40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
fa50: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
fa60: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
fa70: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
fa80: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
fa90: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
faa0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
fab0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
fac0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
fad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
fae0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
faf0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
fb00: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
fb10: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
fb20: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
fb30: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
fb40: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
fb50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
fb60: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
fb70: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
fb80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
fb90: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
fba0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
fbb0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
fbc0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
fbd0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
fbe0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
fbf0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
fc00: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
fc10: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
fc20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fc30: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
fc40: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
fc50: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
fc80: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
fc90: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
fca0: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
fcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
fcc0: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
fcd0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
fce0: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
fcf0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
fd20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
fd30: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
fd40: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
fd50: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
fd60: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
fd70: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
fd80: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
fd90: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fda0: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
fdb0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
fdc0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
fdd0: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
fde0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
fdf0: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
fe00: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
fe10: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
fe20: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
fe30: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
fe40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
fe50: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
fe60: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
fe70: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
fe80: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
fe90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
fea0: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
feb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
fec0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
fed0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
fee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fef0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
ff00: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
ff10: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
ff20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
ff30: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
ff40: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
ff50: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
ff60: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
ff70: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
ff80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
ff90: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
ffa0: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
ffb0: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
ffc0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ffd0: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
ffe0: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
fff0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
10000 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
10010 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
10020 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
10030 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
10040 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
10050 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
10060 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
10070 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
10080 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
10090 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
100a0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
100b0 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
100c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
100d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
100e0 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
100f0 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
10100 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
10110 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
10120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10130 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
10140 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
10150 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
10160 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
10170 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
10180 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
10190 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
101a0 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
101b0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
101c0 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
101d0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
101e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
101f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10200 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
10210 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
10220 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10230 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10240 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10250 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
10260 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
10270 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10280 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10290 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
102a0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
102b0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
102c0 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
102d0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
102e0 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
102f0 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
10300 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10310 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10320 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
10330 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10350 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
10360 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
10370 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
10380 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
10390 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
103a0 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
103b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
103c0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
103d0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
103e0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
103f0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
10400 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
10410 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10420 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
10430 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10440 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
10450 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
10460 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10470 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10480 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
10490 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
104a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
104b0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
104c0 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
104d0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
104e0 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
104f0 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
10500 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
10510 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
10520 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
10530 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
10540 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
10550 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
10560 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10570 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
10580 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
10590 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
105a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
105b0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
105c0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
105d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
105e0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
105f0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
10600 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
10610 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
10620 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
10630 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
10640 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
10650 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
10660 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
10670 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
10680 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10690 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
106a0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
106b0 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
106c0 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
106d0 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
106e0 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
106f0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
10700 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
10710 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
10720 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
10730 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10740 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
10750 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
10760 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
10770 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
10780 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
10790 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
107a0 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
107b0 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
107c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
107d0 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
107e0 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
107f0 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
10800 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
10810 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
10820 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
10830 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
10840 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
10850 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
10860 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
10870 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
10880 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
10890 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
108a0 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
108b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
108c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
108d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
108e0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
108f0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
10900 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
10910 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
10920 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10930 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
10940 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
10950 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
10960 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
10970 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
10980 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
10990 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
109a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
109b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
109c0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
109d0 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
109e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
109f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
10a00 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10a10 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
10a20 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
10a30 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
10a40 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
10a50 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
10a60 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
10a70 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
10a80 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
10a90 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
10aa0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
10ab0 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
10ac0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
10ad0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
10ae0 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
10af0 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
10b00 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
10b10 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
10b20 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
10b30 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
10b40 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
10b50 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10b60 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10b70 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
10b80 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
10b90 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
10ba0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10bb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10bc0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
10bd0 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
10be0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10bf0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10c00 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
10c10 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
10c20 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10c30 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
10c40 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10c50 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10c60 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10c70 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10c80 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10c90 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10ca0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
10cb0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10cc0 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
10cd0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
10ce0 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
10cf0 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
10d00 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
10d10 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
10d20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
10d30 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
10d40 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10d50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10d60 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10d70 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10d80 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
10d90 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
10da0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
10db0 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
10dc0 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
10dd0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
10de0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
10df0 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
10e00 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
10e10 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10e20 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
10e30 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
10e40 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10e50 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10e60 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10e70 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10e80 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
10e90 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
10ea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
10eb0 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
10ec0 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
10ed0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
10ee0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
10ef0 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10f00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10f10 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10f20 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10f30 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10f40 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10f50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10f80 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
10f90 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
10fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
10fb0 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
10fc0 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
10fd0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10ff0 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
11000 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
11010 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
11020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11030 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
11050 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
11060 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
11070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
11080 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
11090 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
110a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
110b0 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
110c0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
110d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
110e0 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
110f0 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
11100 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
11110 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11120 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
11130 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11140 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
11150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11160 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
11170 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
11180 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
11190 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
111a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
111b0 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
111c0 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
111d0 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
111e0 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
111f0 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
11200 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
11210 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
11220 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
11230 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
11240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
11250 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
11260 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
11270 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
11280 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
11290 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
112a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
112b0 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
112c0 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
112d0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
112e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
112f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11300 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
11310 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11320 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11330 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
11340 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
11350 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
11360 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
11370 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
11380 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
11390 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
113a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
113b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
113c0 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
113d0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
113e0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
113f0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
11400 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
11410 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11420 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11430 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
11440 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
11450 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11460 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
11470 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11480 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
11490 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
114a0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
114b0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
114c0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
114d0 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
114e0 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
114f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11500 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11510 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11520 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
11530 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11540 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11550 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
11560 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11590 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
115a0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
115b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
115c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
115d0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
115e0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
115f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
11600 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
11610 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
11620 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
11630 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
11640 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
11650 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
11660 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
11670 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
11680 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
11690 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
116a0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
116b0 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
116c0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
116d0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
116e0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
116f0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
11700 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
11710 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11720 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
11730 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
11740 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
11750 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
11760 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
11770 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
11780 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
11790 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
117a0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
117b0 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
117c0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
117d0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
117e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
117f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
11800 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
11810 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
11820 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
11830 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
11840 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
11850 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
11870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
11890 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
118a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
118b0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
118c0 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
118d0 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
118e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
118f0 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
11900 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
11910 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
11920 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
11930 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
11940 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
11950 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
11960 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
11970 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11980 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
11990 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
119a0 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
119b0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
119c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
119d0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  >PAGER_OPEN );. 
119e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
119f0 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a  iDataVersion;.}.
11a00 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11a10 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11a20 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11a30 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11a40 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11a50 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11a60 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11a70 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11a80 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11a90 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
11aa0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11ab0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11ac0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11ad0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11ae0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11af0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11b00 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11b10 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11b20 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11b30 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11b40 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11b50 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11b60 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11b80 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11b90 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11ba0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11bb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11bc0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11bd0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75  de || sqlite3Jou
11be0 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
11bf0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11c00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11c10 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11c20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11c30 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11c40 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11c50 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11c60 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11c70 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11c80 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11c90 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11ca0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11cb0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11cc0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11cd0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11ce0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
11cf0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11d10 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11d20 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11d30 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11d40 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11d50 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11d60 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11d70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11d80 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11d90 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11da0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11db0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11dd0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11de0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11df0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11e00 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11e10 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11e20 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11e30 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11e40 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11e50 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11e60 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11e70 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11e80 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11e90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11eb0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11ec0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11ed0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11ee0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11ef0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11f00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11f10 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
11f20 54 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20  T./*.** If they 
11f30 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c  are not already,
11f40 20 62 65 67 69 6e 20 72 65 63 6f 72 64 69 6e 67   begin recording
11f50 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
11f60 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
11f70 61 79 65 72 0a 2a 2a 20 62 79 20 74 68 65 20 62  ayer.** by the b
11f80 2d 74 72 65 65 20 6c 61 79 65 72 20 54 68 69 73  -tree layer This
11f90 20 69 73 20 75 73 65 64 20 62 79 20 63 6f 6e 63   is used by conc
11fa0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
11fb0 6f 6e 73 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  ons. Return.** S
11fc0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11fd0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
11fe0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11ff0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69  (SQLITE_NOMEM) i
12000 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
12010 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
12020 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f  ite3PagerBeginCo
12030 6e 63 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a  ncurrent(Pager *
12040 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
12050 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12060 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
12070 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
12080 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
12090 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
120a0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
120b0 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
120c0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
120d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
120e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
120f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  rn rc;.}../* !de
12110 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12120 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
12130 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72 64 69  .** Stop recordi
12140 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  ng all pages rea
12150 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
12160 20 6c 61 79 65 72 20 62 79 20 74 68 65 20 62 2d   layer by the b-
12170 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61 6e  tree layer.** an
12180 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63 75  d discard any cu
12190 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a  rrent records..*
121a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
121b0 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74  gerEndConcurrent
121c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
121d0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
121e0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
121f0 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50 61  pAllRead);.  pPa
12200 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20  ger->pAllRead = 
12210 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  0;.}../* !define
12220 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
12230 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
12240 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
12250 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
12260 6e 20 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73  n wal mode. Fals
12270 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
12280 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12290 49 73 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  IsWal(Pager *pPa
122a0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
122b0 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a  Pager->pWal!=0;.
122c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
122d0 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
122e0 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  NT */../*.** Fre
122f0 65 20 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a  e the Pager.pInJ
12300 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72  ournal and Pager
12310 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63  .pAllRead bitvec
12320 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
12330 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
12340 65 65 42 69 74 76 65 63 73 28 50 61 67 65 72 20  eeBitvecs(Pager 
12350 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
12360 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
12370 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
12380 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
12390 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
123a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e    sqlite3PagerEn
123b0 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67  dConcurrent(pPag
123c0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
123d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
123e0 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
123f0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12400 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
12410 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
12420 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
12430 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
12440 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
12450 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
12460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
12470 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
12480 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
12490 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
124a0 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
124b0 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
124c0 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
124d0 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
124e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
124f0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
12500 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
12510 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
12520 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
12530 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
12540 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
12550 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
12560 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
12570 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
12580 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12590 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
125a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
125b0 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
125c0 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
125d0 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
125e0 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
125f0 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
12600 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
12610 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12620 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
12630 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
12640 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
12650 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12660 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
12670 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
12680 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
12690 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
126a0 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
126b0 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
126c0 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
126d0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
126e0 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
126f0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
12700 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
12710 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
12720 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12730 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
12740 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
12750 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
12760 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
12770 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12780 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
12790 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65    pagerFreeBitve
127a0 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  cs(pPager);.  re
127b0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
127c0 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
127d0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
127e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
127f0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
12800 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
12810 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
12820 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
12830 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
12840 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12850 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12860 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
12870 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12880 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
128b0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
128c0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
128d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
128e0 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
128f0 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
12900 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
12910 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
12920 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
12930 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12940 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
12950 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
12960 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
12970 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
12980 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
12990 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
129a0 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
129b0 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
129c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
129d0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
129e0 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
129f0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
12a00 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
12a10 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
12a20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12a30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
12a40 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
12a50 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12a60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
12a70 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
12a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12a90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12aa0 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
12ab0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12ac0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12ad0 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
12ae0 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12af0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12b00 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
12b10 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
12b20 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12b30 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
12b40 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
12b50 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12b60 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12b70 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12b80 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12b90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12ba0 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12bc0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12bd0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12be0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
12bf0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12c00 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
12c10 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
12c20 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
12c30 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
12c40 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
12c50 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12c60 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12c70 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12c80 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12c90 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12ca0 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12cb0 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12cc0 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12cd0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12ce0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12cf0 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
12d00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12d10 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
12d20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
12d30 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
12d40 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
12d50 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12d60 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12d70 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12d80 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12d90 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12da0 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12db0 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12dc0 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12dd0 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12de0 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12df0 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
12e00 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
12e10 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
12e20 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
12e30 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
12e40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12e50 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12e60 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12e70 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12e80 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12e90 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12ea0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12eb0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12ec0 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12ed0 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12ee0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12ef0 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12f00 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12f10 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12f20 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12f30 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12f40 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12f50 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12f60 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12f70 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12f80 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12f90 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12fa0 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12fb0 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12fc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
12fd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12fe0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
12ff0 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
13000 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
13010 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
13020 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
13030 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
13050 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
13060 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
13070 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13080 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
13090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
130a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
130b0 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   (isOpen(pPager-
130c0 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f 50  >jfd) ? PAGER_OP
130d0 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44 45  EN : PAGER_READE
130e0 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
130f0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
13100 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
13110 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
13120 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
13130 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
13140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65  QLITE_OK;.    se
13150 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50  tGetterMethod(pP
13160 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50  ager);.  }..  pP
13170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13180 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13190 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
131a0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
131b0 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter = 0;.}../*.*
131c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
131d0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
131e0 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46  er an IOERR or F
131f0 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72  ULL error that r
13200 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70  equires.** the p
13210 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69  ager to transiti
13220 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  on into the ERRO
13230 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76 65  R state may ahve
13240 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68   occurred..** Th
13250 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13260 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
13270 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
13280 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
13290 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63   .** the error-c
132a0 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
132b0 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
132c0 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
132d0 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20  . The .** value 
132e0 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
132f0 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
13300 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
13310 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
13320 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
13330 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
13340 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
13350 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
13360 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75   the.** IOERR su
13370 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67  b-codes, the pag
13380 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52  er enters the ER
13390 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68  ROR state and th
133a0 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
133b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  is stored in Pag
133c0 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c  er.errCode. Whil
133d0 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61  e the pager rema
133e0 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ins in the ERROR
133f0 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d   state,.** all m
13400 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f  ajor API calls o
13410 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c  n the Pager will
13420 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
13430 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64  urn Pager.errCod
13440 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52  e..**.** The ERR
13450 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61 74  OR state indicat
13460 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
13470 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
13480 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
13490 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
134a0 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
134b0 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
134c0 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
134d0 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
134e0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
134f0 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
13500 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
13510 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
13520 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
13530 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
13540 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
13550 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
13560 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
13570 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
13580 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
13590 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
135a0 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
135b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
135c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
135d0 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
135e0 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
135f0 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
13600 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
13610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
13620 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
13630 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
13640 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
13650 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
13660 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
13670 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
13680 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
13690 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
136a0 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
136b0 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d    );.  if( rc2==
136c0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72  SQLITE_FULL || r
136d0 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
136e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
136f0 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
13700 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13710 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a   = PAGER_ERROR;.
13720 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74      setGetterMet
13730 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  hod(pPager);.  }
13740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13750 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13760 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
13770 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
13780 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
13790 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
137a0 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67  ion open on pPag
137b0 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  er is being comm
137c0 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d  itted (bCommit==
137d0 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20  1).** or rolled 
137e0 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30  back (bCommit==0
137f0 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
13800 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79  TRUE if and only
13810 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   if all dirty pa
13820 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c  ges should be fl
13830 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ushed to disk..*
13840 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a  *.** Rules:.**.*
13850 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54  *   *  For non-T
13860 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20 61  EMP databases, a
13870 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69  lways sync to di
13880 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  sk.  This is nec
13890 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66  essary.**      f
138a0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  or transactions 
138b0 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a  to be durable..*
138c0 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54  *.**   *  Sync T
138d0 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  EMP database onl
138e0 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e  y on a COMMIT (n
138f0 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77  ot a ROLLBACK) w
13900 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a  hen the backing.
13910 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61 73  **      file has
13920 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c   been created al
13930 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70 69  ready (via a spi
13940 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73  ll on pagerStres
13950 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20  s()) and.**     
13960 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
13970 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
13980 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64  in memory exceed
13990 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74  s 25% of the tot
139a0 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65  al.**      cache
139b0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
139c0 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f   int pagerFlushO
139d0 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  nCommit(Pager *p
139e0 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  Pager, int bComm
139f0 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  it){.  if( pPage
13a00 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
13a10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
13a20 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75   !bCommit ) retu
13a30 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 0;.  if( !isO
13a40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
13a50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
13a60 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61  turn (sqlite3PCa
13a70 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79 28  chePercentDirty(
13a80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13a90 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >=25);.}../*.** 
13aa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
13ab0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
13ac0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
13ad0 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
13ae0 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
13af0 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
13b00 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
13b10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
13b20 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
13b30 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
13b40 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
13b50 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
13b60 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
13b70 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
13b80 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
13b90 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
13ba0 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
13bb0 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
13bc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
13bd0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13be0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
13bf0 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
13c00 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
13c10 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
13c20 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
13c30 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
13c40 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
13c50 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
13c60 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
13c70 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
13c80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13c90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
13ca0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
13cb0 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
13cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
13cd0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
13ce0 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
13cf0 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
13d00 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
13d10 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
13d20 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
13d30 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
13d40 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
13d50 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
13d60 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
13d70 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
13d80 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
13d90 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
13da0 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
13db0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
13dc0 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
13dd0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
13de0 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
13df0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
13e00 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13e10 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13e20 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
13e30 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
13e40 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
13e50 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
13e60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
13e70 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13e80 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
13e90 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
13ea0 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
13eb0 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
13ec0 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
13ed0 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
13ee0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
13ef0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
13f00 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
13f10 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
13f20 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
13f30 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
13f40 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
13f50 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
13f60 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
13f70 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
13f80 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
13f90 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
13fa0 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
13fb0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
13fc0 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
13fd0 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
13fe0 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
13ff0 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
14000 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
14010 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
14020 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
14030 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
14040 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
14050 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
14060 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
14070 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
14080 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
14090 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
140a0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
140b0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
140c0 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
140d0 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
140e0 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
140f0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
14100 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
14110 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
14120 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
14130 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
14140 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
14150 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
14160 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
14170 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
14180 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
14190 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
141a0 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
141b0 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
141c0 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
141d0 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
141e0 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
141f0 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
14200 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
14210 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
14220 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
14230 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
14240 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
14250 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
14260 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
14270 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
14280 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14290 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
142a0 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
142b0 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
142c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
142d0 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
142e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
142f0 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
14300 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
14310 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
14320 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
14330 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
14340 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
14350 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
14360 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
14370 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
14380 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14390 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
143a0 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
143b0 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
143c0 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
143d0 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
143e0 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
143f0 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
14400 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
14410 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
14420 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
14430 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
14440 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
14450 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
14460 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
14470 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
14480 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d  Master, int bCom
14490 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mit){.  int rc =
144a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
144b0 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
144c0 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
144d0 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
144e0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
144f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14500 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
14510 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
14520 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
14530 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
14540 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f   if the pager do
14550 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f  es not have an o
14560 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
14570 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74  ction.  ** or at
14580 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
14590 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e  D lock. This fun
145a0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
145b0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20  led when there. 
145c0 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d   ** is no write-
145d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
145e0 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45  ve but a RESERVE
145f0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
14600 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75  k is.  ** held u
14610 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73  nder two circums
14620 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  tances:.  **.  *
14630 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73  *   1. After a s
14640 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f  uccessful hot-jo
14650 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
14660 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  it is called wit
14670 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61  h.  **      eSta
14680 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61  te==PAGER_NONE a
14690 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
146a0 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20  IVE_LOCK..  **. 
146b0 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f   **   2. If a co
146c0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f  nnection with lo
146d0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
146e0 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  sive holding an 
146f0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20  EXCLUSIVE .  ** 
14700 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68       lock switch
14710 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69  es back to locki
14720 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61  ng_mode=normal a
14730 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73  nd then executes
14740 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61   a.  **      rea
14750 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d-transaction, t
14760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14770 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61  called with eSta
14780 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14790 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20   .  **      and 
147a0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
147b0 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72  _LOCK when the r
147c0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
147d0 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a  is closed..  */.
147e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
147f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
14800 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
14810 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14820 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
14830 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14840 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
14850 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61  ER_LOCKED && pPa
14860 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52  ger->eLock<RESER
14870 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
14880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14890 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  ;.  }..  release
148a0 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
148b0 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
148c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
148d0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
148e0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
148f0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
14900 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
14910 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
14920 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
14930 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
14940 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
14950 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
14960 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
14970 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14980 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  >jfd) ){.      /
14990 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72  * assert( pPager
149a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
149b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
149c0 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20  _MEMORY ); */.  
149d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
149e0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
149f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14a00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14a10 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14a20 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
14a30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
14a40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14a50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
14a60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14a90 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14aa0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
14ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14ac0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
14ad0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
14ae0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
14af0 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
14b00 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
14b10 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
14b20 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
14b30 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
14b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
14b50 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
14b60 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
14b70 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
14b80 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
14b90 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
14ba0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
14bb0 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
14bc0 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
14bd0 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
14be0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
14bf0 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
14c00 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14c10 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14c20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14c30 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
14c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14c50 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14c60 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14c90 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14ca0 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
14cb0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
14cc0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
14cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14ce0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
14cf0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
14d00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
14d10 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
14d20 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c  ger, hasMaster||
14d30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14d40 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14d50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14d70 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14d80 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
14d90 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
14da0 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
14db0 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
14dc0 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
14dd0 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
14de0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14df0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14e00 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
14e10 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
14e20 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
14e30 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
14e40 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
14e50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
14e60 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
14e70 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
14e80 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
14e90 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14ea0 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65  te = !pPager->te
14eb0 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73  mpFile;.      as
14ec0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75  sert( sqlite3Jou
14ed0 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14ee0 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29  Pager->jfd)==0 )
14ef0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14f00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14f10 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14f20 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14f30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14f40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14f50 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14f60 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
14f70 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14f80 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14f90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14fa0 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
14fb0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14fc0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
14fe0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
14ff0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
15000 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
15010 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
15020 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
15030 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
15040 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
15050 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
15060 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
15070 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
15080 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15090 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
150a0 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
150b0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
150c0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
150d0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
150e0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
150f0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
15100 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
15110 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
15120 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
15130 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
15140 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
15150 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
15160 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15170 64 69 66 0a 0a 20 20 70 61 67 65 72 46 72 65 65  dif..  pagerFree
15180 42 69 74 76 65 63 73 28 70 50 61 67 65 72 29 3b  Bitvecs(pPager);
15190 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
151a0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
151b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
151c0 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67  if( MEMDB || pag
151d0 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28  erFlushOnCommit(
151e0 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29  pPager, bCommit)
151f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15200 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
15210 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
15220 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15230 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15240 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50  ClearWritable(pP
15250 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
15260 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15270 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
15280 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
15290 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
152a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
152b0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
152c0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
152d0 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
152e0 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
152f0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
15300 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
15310 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
15320 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
15330 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
15340 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
15350 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
15360 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
15370 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
15380 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
15390 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
153a0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
153b0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
153c0 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
153d0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
153e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
153f0 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
15400 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
15410 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
15420 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
15430 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
15440 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
15450 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
15460 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
15470 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
15480 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15490 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
154a0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
154b0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
154c0 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
154d0 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
154e0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
154f0 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
15500 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
15510 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
15520 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
15530 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
15540 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
15550 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
15560 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
15570 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
15580 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
15590 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
155a0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
155b0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
155c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
155d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
155e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
155f0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
15600 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
15610 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
15620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
15630 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
15640 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
15650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15660 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
15670 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
15680 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
15690 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
156a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
156b0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
156c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
156d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
156e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
156f0 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
15700 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
15710 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
15720 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
15730 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
15740 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
15750 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
15760 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
15770 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
15780 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
15790 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
157a0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
157b0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
157c0 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
157d0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
157e0 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
157f0 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
15800 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
15810 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
15820 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
15830 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
15840 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
15850 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
15860 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
15870 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
15880 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
15890 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
158a0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
158b0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
158c0 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
158d0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
158e0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
158f0 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
15900 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
15910 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
15920 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
15930 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
15940 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
15950 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
15960 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
15970 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
15980 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
15990 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
159a0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
159b0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
159c0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
159d0 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
159e0 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
159f0 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
15a00 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15a10 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
15a20 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
15a30 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
15a40 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
15a50 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
15a60 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
15a70 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
15a80 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
15a90 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
15aa0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
15ab0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
15ac0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
15ad0 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
15ae0 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
15af0 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
15b00 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
15b10 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
15b20 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
15b30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
15b40 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15b50 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
15b60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15b70 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
15b80 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
15b90 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
15ba0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
15bb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15bc0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15bd0 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15be0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15bf0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15c00 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15c10 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15c20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15c30 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15c40 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15c50 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
15c60 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
15c70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
15c80 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
15c90 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
15ca0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
15cb0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15cc0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15cd0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15cf0 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15d00 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15d10 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15d20 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15d30 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15d40 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15d50 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
15d60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15d70 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
15d80 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15d90 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15da0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15db0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15dc0 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15dd0 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15de0 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15df0 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15e00 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15e10 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15e20 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15e30 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15e40 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15e50 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
15e60 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
15e70 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
15e80 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15e90 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15ea0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15eb0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15ec0 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15ed0 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15ee0 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15ef0 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15f00 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15f10 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15f20 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15f30 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15f40 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15f50 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
15f60 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
15f70 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15f80 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15f90 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15fa0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15fb0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15fc0 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15fd0 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15fe0 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15ff0 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
16000 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
16010 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
16020 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
16030 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
16040 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
16050 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
16060 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
16070 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
16080 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
16090 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
160a0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
160b0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
160c0 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
160d0 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
160e0 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
160f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16100 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
16110 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
16120 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
16130 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
16140 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16150 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
16160 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
16170 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
16180 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
16190 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
161a0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
161b0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
161c0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
161d0 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
161e0 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
161f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16200 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
16210 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
16220 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
16230 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
16240 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
16250 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
16260 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
16270 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
16280 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
16290 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
162c0 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
162d0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
162e0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
162f0 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
16300 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
16310 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
16320 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
16330 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
16340 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16350 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16360 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
16370 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
16380 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
16390 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
163a0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
163b0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
163c0 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
163d0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
163e0 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
163f0 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
16400 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
16410 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
16420 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
16430 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
16440 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
16450 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
16460 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
16470 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
16480 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
16490 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
164a0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
164b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
164c0 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
164d0 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
164e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
164f0 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
16500 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
16510 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16520 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
16530 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
16540 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
16550 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
16560 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
16570 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
16580 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
16590 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
165a0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
165b0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
165c0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
165d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
165e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
165f0 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
16600 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
16610 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
16620 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
16630 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16640 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
16650 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
16660 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16670 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
16680 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
16690 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
166a0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
166b0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
166c0 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
166d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
166e0 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
166f0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
16700 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
16710 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
16720 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
16730 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
16740 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
16750 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
16760 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
16770 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
16780 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
16790 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
167a0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
167b0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
167c0 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
167d0 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
167e0 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
167f0 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
16800 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
16810 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
16820 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
16830 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
16840 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16850 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
16860 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
16870 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
16880 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
16890 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
168a0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
168b0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
168c0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
168d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
168e0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
168f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16900 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
16910 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
16920 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
16930 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
16940 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
16950 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16960 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
16970 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
16980 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
16990 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
169a0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
169b0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
169c0 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
169d0 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
169e0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
169f0 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
16a00 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
16a10 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
16a20 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
16a30 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
16a40 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
16a50 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
16a60 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
16a70 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
16a80 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
16a90 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
16aa0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
16ab0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
16ac0 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
16ad0 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
16ae0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16af0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
16b00 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
16b10 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16b20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
16b30 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
16b40 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
16b50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
16b60 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16b70 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
16b80 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
16b90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
16ba0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
16bb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16bc0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16bd0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16be0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16bf0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16c00 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16c10 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16c20 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16c30 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16c40 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16c50 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
16c60 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
16c70 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
16c80 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
16c90 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
16ca0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
16cb0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16cc0 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16cd0 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16ce0 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16cf0 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16d10 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16d20 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16d30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16d40 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d60 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
16d70 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
16d80 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
16db0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16dc0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16dd0 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16df0 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16e00 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16e10 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16e20 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16e30 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16e40 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16e50 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
16e60 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
16e70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16e80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16e90 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
16ea0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
16eb0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16ec0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16ed0 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16ee0 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66  is synced */.#if
16ef0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16f00 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72  ODEC.  /* The jr
16f10 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72  nlEnc flag is tr
16f20 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61  ue if Journal pa
16f30 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61  ges should be pa
16f40 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  ssed through.  *
16f50 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74  * the codec.  It
16f60 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75   is false for pu
16f70 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  re in-memory jou
16f80 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73  rnals. */.  cons
16f90 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20  t int jrnlEnc = 
16fa0 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70  (isMainJrnl || p
16fb0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
16fc0 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a  ory==0);.#endif.
16fd0 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
16fe0 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
16ff0 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
17000 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
17010 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
17020 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
17030 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
17040 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
17050 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
17060 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
17070 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
17080 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
17090 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
170a0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
170b0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
170c0 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
170d0 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
170e0 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
170f0 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
17100 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
17110 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
17120 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
17130 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
17140 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
17150 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
17160 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
17170 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
17180 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
17190 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
171a0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
171b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
171c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
171d0 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
171e0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
171f0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
17200 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
17210 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
17220 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
17230 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17240 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
17250 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
17260 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
17270 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
17280 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
17290 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
172a0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
172b0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
172c0 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
172d0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
172e0 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
172f0 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
17300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17310 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17320 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
17330 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
17340 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
17350 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
17360 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
17370 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
17380 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17390 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
173a0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
173b0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
173c0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
173d0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
173e0 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
173f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
17400 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
17410 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
17420 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
17430 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
17440 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
17450 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
17460 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
17470 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
17480 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
17490 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
174a0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
174b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
174c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
174d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
174e0 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
174f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17500 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
17510 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17520 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17530 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
17540 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
17550 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
17560 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
17570 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
17580 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
17590 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
175a0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
175b0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
175c0 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
175d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
175e0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
175f0 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
17600 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
17610 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
17620 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
17630 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
17640 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
17650 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
17660 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
17670 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
17680 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
17690 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
176a0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
176b0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
176c0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
176d0 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
176e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
176f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
17700 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
17710 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
17720 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
17730 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
17740 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17760 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
17770 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
17780 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
17790 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
177a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
177b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
177c0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
177d0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
177e0 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
177f0 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
17800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17810 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
17820 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
17830 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17840 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66   played back bef
17850 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
17860 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
17870 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
17880 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
17890 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
178a0 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
178b0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
178c0 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
178d0 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
178e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
178f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
17900 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
17910 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
17920 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
17930 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
17940 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
17950 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
17960 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
17970 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
17980 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
17990 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
179a0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
179b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
179c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
179d0 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
179e0 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
179f0 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
17a00 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
17a10 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17a20 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
17a30 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
17a40 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
17a50 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
17a60 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
17a70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
17a80 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
17a90 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
17aa0 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
17ab0 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
17ac0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17ad0 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
17ae0 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
17af0 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
17b00 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
17b10 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
17b20 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
17b30 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
17b40 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
17b50 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
17b60 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
17b70 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
17b80 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
17b90 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
17ba0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
17bb0 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
17bc0 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
17bd0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
17be0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
17bf0 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
17c00 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
17c10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
17c20 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
17c30 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
17c40 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
17c50 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
17c60 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
17c70 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
17c80 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
17c90 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
17ca0 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
17cb0 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
17cc0 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
17cd0 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
17ce0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
17cf0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
17d00 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
17d10 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
17d20 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
17d30 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
17d40 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17d50 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
17d60 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
17d70 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
17d80 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
17d90 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
17da0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
17db0 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
17dc0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
17dd0 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
17de0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17df0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
17e00 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
17e10 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
17e20 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
17e30 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
17e40 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
17e50 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
17e60 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
17e70 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
17e80 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
17e90 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
17ea0 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
17eb0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
17ec0 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
17ed0 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
17ee0 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
17ef0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17f00 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
17f10 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
17f20 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
17f30 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
17f40 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
17f50 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
17f60 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
17f70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17f80 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
17f90 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
17fa0 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
17fb0 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
17fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
17fd0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
17fe0 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
17ff0 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
18000 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
18010 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
18020 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
18030 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
18040 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
18050 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
18060 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
18070 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
18080 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
18090 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
180a0 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
180b0 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
180c0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
180d0 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
180e0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
180f0 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
18100 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
18110 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
18120 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
18130 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
18140 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
18150 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
18160 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
18170 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
18180 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
18190 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
181a0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
181b0 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
181c0 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
181d0 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
181e0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
181f0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
18200 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
18210 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
18220 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
18230 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18240 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
18250 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
18260 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18270 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
18280 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20  EN || pPg==0 || 
18290 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
182a0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
182b0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
182c0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
182d0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
182e0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
182f0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
18300 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
18310 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
18320 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
18330 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
18340 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
18350 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
18360 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
18370 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
18380 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
18390 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
183a0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
183b0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
183c0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
183d0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
183e0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
183f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
18400 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
18410 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
18420 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
18430 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
18440 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
18450 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
18460 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
18470 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
18480 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
18490 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
184a0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
184b0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
184c0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
184d0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
184e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
184f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18500 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
18510 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
18520 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20 72  Write the data r
18530 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
18540 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74  rnal back into t
18550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18560 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
18570 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76   usually safe ev
18580 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70  en for an encryp
18590 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20 61  ted database - a
185a0 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  s the data.    *
185b0 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64 20  * was encrypted 
185c0 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77 72  before it was wr
185d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
185e0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65  rnal file. The e
185f0 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  xception.    ** 
18600 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20 77  is if the data w
18610 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  as just read fro
18620 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  m an in-memory s
18630 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74  ub-journal. In t
18640 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  hat.    ** case 
18650 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79  it must be encry
18660 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  pted here before
18670 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
18680 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
18690 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f      ** file.  */
186a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
186b0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28  AS_CODEC.    if(
186c0 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20   !jrnlEnc ){.   
186d0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
186e0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
186f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18700 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a  M_BKPT, aData);.
18710 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18720 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
18730 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
18740 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
18750 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
18760 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
18770 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
18780 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18790 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73  _BKPT);.    }els
187a0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  e.#endif.    rc 
187b0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
187c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
187d0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
187e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
187f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  );..    if( pgno
18800 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
18810 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
18820 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
18830 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
18840 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
18850 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20  ackup ){.#ifdef 
18860 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18870 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45  .      if( jrnlE
18880 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f  nc ){.        CO
18890 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
188a0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
188b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
188c0 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
188d0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
188e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
188f0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
18900 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  a);.        CODE
18910 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
18920 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
18930 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
18940 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65  aData);.      }e
18950 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
18960 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
18970 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
18980 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
18990 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  )aData);.    }. 
189a0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
189b0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
189c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
189d0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
189e0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
189f0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
18a00 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
18a10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18a20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
18a30 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
18a40 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
18a50 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
18a60 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
18a70 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
18a80 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
18a90 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
18aa0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
18ab0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
18ac0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
18ad0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
18ae0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
18af0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18b00 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
18b10 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
18b20 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
18b30 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
18b40 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
18b50 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
18b60 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
18b70 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
18b80 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
18b90 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
18ba0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
18bb0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
18bc0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18bd0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
18be0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
18bf0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
18c00 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
18c10 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
18c20 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
18c30 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
18c40 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
18c50 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
18c60 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
18c70 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
18c80 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
18c90 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
18ca0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
18cb0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
18cc0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
18cd0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
18ce0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
18cf0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
18d00 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
18d10 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
18d20 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18d30 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
18d40 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
18d50 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
18d60 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18d70 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30  LAG_ROLLBACK)==0
18d80 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18d90 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
18da0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18db0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18dc0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
18dd0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
18de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18df0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18e00 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
18e10 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20  OLLBACK)!=0 );. 
18e20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
18e30 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
18e40 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
18e50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18e60 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18e70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18e80 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
18e90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
18ea0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
18eb0 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
18ec0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
18ed0 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
18ee0 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
18ef0 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
18f00 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
18f10 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
18f20 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
18f30 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
18f40 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
18f50 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
18f60 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
18f70 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
18f80 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
18f90 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
18fa0 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
18fb0 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
18fc0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
18fd0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
18fe0 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
18ff0 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
19000 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
19010 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
19020 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
19030 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19040 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
19050 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
19060 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  /* It used to be
19070 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61   that sqlite3Pca
19080 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
19090 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72  ) was called her
190a0 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74  e.  But.    ** t
190b0 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e  hat call was dan
190c0 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e  gerous and had n
190d0 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e  o detectable ben
190e0 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63  efit since the c
190f0 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  ache.    ** is n
19100 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20  ormally cleaned 
19110 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
19120 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72  CleanAll() after
19130 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f   rollback and so
19140 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
19150 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20   removed. */.   
19160 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
19170 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
19180 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
19190 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
191a0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
191b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
191c0 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
191d0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
191e0 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
191f0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
19200 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19210 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
19220 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
19230 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19240 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19250 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
19260 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
19270 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
19280 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  /.#if SQLITE_HAS
19290 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a  _CODEC.    if( j
192a0 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31  rnlEnc ){ CODEC1
192b0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
192c0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
192d0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
192e0 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  PT); }.#endif.  
192f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19300 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
19310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19320 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
19330 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
19340 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
19350 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
19360 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
19370 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
19380 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
19390 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
193a0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
193b0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
193c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
193d0 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
193e0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
193f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19400 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
19410 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
19420 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
19430 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
19440 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
19450 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
19460 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
19470 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
19480 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
19490 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
194a0 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
194b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
194c0 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
194d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
194e0 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
194f0 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
19500 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
19510 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
19520 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
19530 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
19540 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
19550 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
19560 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
19570 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
19580 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
19590 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
195a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
195b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
195c0 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
195d0 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
195e0 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
195f0 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
19600 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
19610 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
19620 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
19630 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
19640 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
19650 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
19660 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
19670 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
19680 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
19690 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
196a0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
196b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
196c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
196d0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
196e0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
196f0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
19700 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
19710 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19720 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
19730 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
19740 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
19750 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
19760 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
19770 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
19780 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
19790 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
197a0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
197b0 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
197c0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
197d0 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
197e0 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
197f0 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
19800 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
19810 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
19820 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
19830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19840 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
19850 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
19860 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
19870 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
19880 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
19890 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
198a0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
198b0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
198c0 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
198d0 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
198e0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
198f0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
19900 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
19910 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
19920 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
19930 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
19940 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
19950 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
19960 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
19970 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
19980 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
19990 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
199a0 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
199b0 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
199c0 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
199d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
199e0 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
199f0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
19a00 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
19a10 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
19a20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
19a30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
19a40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19a50 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
19a60 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
19a70 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
19a80 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
19a90 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
19aa0 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
19ab0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19ac0 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
19ad0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
19ae0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
19af0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19b00 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19b10 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19b40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
19b50 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
19b60 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
19b70 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19b80 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
19b90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
19ba0 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
19bb0 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
19bc0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
19bd0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
19be0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
19bf0 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
19c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19c10 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
19c20 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
19c30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
19c40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19c50 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
19c60 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
19c70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19c80 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
19c90 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
19ca0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
19cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
19cc0 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
19cd0 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
19ce0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
19cf0 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
19d00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
19d10 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
19d20 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
19d30 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
19d40 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
19d50 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
19d60 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
19d70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
19d80 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
19d90 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
19da0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19db0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
19dc0 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
19dd0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
19de0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
19df0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
19e00 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
19e10 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
19e20 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
19e30 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
19e40 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
19e50 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
19e60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19e70 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
19e80 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
19e90 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
19ea0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19eb0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
19ec0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
19ed0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19ee0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
19ef0 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
19f00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
19f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19f20 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19f30 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
19f40 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
19f50 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
19f60 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
19f70 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
19f80 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
19f90 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
19fa0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
19fb0 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
19fc0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
19fd0 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
19fe0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
19ff0 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
1a000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
1a010 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
1a020 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
1a030 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
1a040 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1a050 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
1a060 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
1a070 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a080 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
1a090 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
1a0a0 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
1a0b0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
1a0c0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
1a0d0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1a0e0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
1a0f0 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
1a100 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
1a110 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
1a120 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a130 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
1a140 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a150 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20   }.  zMasterPtr 
1a160 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
1a170 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
1a180 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
1a190 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
1a1a0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
1a1b0 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
1a1c0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66  ournal, 0);.  if
1a1d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a1e0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
1a1f0 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  _out;.  zMasterJ
1a200 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
1a210 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a  urnal] = 0;..  z
1a220 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
1a230 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c  rJournal;.  whil
1a240 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
1a250 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
1a260 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a270 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
1a280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a290 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
1a2a0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
1a2b0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
1a2c0 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20  xists);.    if( 
1a2d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a2e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
1a2f0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
1a300 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20  .    if( exists 
1a310 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ){.      /* One 
1a320 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
1a330 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
1a340 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a350 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a   exists..      *
1a360 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
1a370 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
1a380 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
1a390 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
1a3a0 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
1a3b0 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
1a3c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a3d0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
1a3e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  /.      int c;. 
1a3f0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1a400 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1a410 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
1a420 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
1a430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a440 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1a450 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
1a460 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
1a470 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a490 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a4a0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a4b0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
1a4c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
1a4d0 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
1a4e0 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
1a4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1a500 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
1a510 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a530 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a540 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a550 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
1a560 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
1a570 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
1a580 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
1a590 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
1a5a0 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1a5b0 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
1a5c0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1a5d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1a5e0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
1a5f0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a610 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
1a620 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
1a630 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
1a640 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
1a650 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
1a660 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1a670 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
1a680 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
1a690 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a6a0 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
1a6b0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
1a6c0 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
1a6d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a6e0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1a6f0 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
1a700 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
1a710 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
1a720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a730 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1a740 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1a750 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
1a760 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1a770 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
1a780 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1a790 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
1a7a0 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1a7b0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
1a7c0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
1a7d0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
1a7e0 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
1a7f0 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
1a800 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
1a810 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1a820 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1a830 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1a840 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
1a850 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
1a860 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
1a870 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
1a880 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a890 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
1a8a0 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
1a8b0 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
1a8c0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
1a8d0 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
1a8e0 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
1a8f0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
1a900 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
1a910 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
1a920 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
1a930 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
1a940 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
1a950 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
1a960 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
1a970 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
1a980 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
1a990 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
1a9a0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
1a9b0 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
1a9c0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1a9d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
1a9e0 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
1a9f0 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
1aa00 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
1aa10 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
1aa20 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
1aa30 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
1aa40 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
1aa50 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
1aa60 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
1aa70 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
1aa80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
1aa90 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
1aaa0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1aab0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
1aac0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1aad0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1aae0 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
1aaf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ab00 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
1ab10 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
1ab20 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1ab30 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
1ab40 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
1ab50 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1ab60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ab70 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1ab80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ab90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1aba0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1abb0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1abc0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
1abd0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1abe0 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
1abf0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1ac00 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1ac10 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1ac20 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1ac30 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1ac40 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1ac50 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1ac60 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1ac70 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1ac80 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1ac90 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1aca0 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1acb0 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1acc0 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1acd0 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1ace0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1acf0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1ad00 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1ad10 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1ad20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1ad30 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1ad40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1ad50 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1ad60 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1ad70 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1ad80 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1ad90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1ada0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1adb0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1adc0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1add0 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1ade0 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1adf0 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1ae00 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ae10 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1ae20 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1ae30 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1ae40 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1ae50 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1ae60 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1ae70 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1ae80 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1ae90 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1aea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1aeb0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1aec0 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1aed0 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1aee0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1aef0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1af00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1af10 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1af20 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1af30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1af40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1af50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1af60 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1af70 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1af80 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1af90 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1afa0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1afb0 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1afc0 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1afd0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1afe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1aff0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1b000 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1b010 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1b020 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1b030 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1b040 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1b050 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1b060 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1b070 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1b080 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1b090 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1b0a0 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1b0b0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1b0c0 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1b0d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b0e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1b0f0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1b100 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1b110 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1b120 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1b130 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1b140 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1b150 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1b160 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b170 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1b180 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1b190 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1b1a0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1b1b0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1b1c0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1b1d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b1e0 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1b1f0 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1b200 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1b210 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b220 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b230 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1b240 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1b250 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b260 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1b270 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1b280 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b290 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1b2a0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b2b0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1b2c0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1b2d0 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1b2e0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1b2f0 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1b300 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1b310 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1b320 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b330 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1b340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b350 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1b360 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1b370 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1b380 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1b390 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1b3a0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1b3b0 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1b3c0 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1b3d0 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1b3e0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1b3f0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1b400 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1b410 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1b420 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1b430 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1b440 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1b450 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1b460 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1b470 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1b480 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1b490 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1b4a0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1b4b0 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1b4c0 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1b4d0 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1b4e0 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1b4f0 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1b500 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1b510 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1b520 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1b530 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1b540 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1b550 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b560 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1b570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b580 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1b590 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b5a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b5b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1b5c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1b5d0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b5e0 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1b5f0 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1b600 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b610 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b630 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b640 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1b650 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b660 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1b670 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1b680 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1b690 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1b6a0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1b6b0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1b6c0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1b6d0 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1b6e0 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1b6f0 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1b700 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1b710 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1b720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1b730 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b740 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1b750 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1b760 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1b770 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1b780 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1b790 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1b7a0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1b7b0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1b7c0 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1b7d0 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1b7e0 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1b7f0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b800 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1b810 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1b820 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1b830 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1b840 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1b850 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b860 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b870 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1b880 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1b890 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1b8a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b8b0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1b8c0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b8d0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b8e0 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1b8f0 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1b900 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1b910 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1b920 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b930 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b940 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1b950 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1b960 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1b970 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1b980 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1b990 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1b9a0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1b9b0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1b9c0 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1b9d0 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1b9e0 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1b9f0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1ba00 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ba10 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1ba20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1ba30 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1ba40 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1ba50 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1ba60 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ba70 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1ba80 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1ba90 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1baa0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1bab0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1bac0 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1bad0 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1bae0 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1baf0 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1bb00 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1bb10 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1bb20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1bb30 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1bb40 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1bb50 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1bb60 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1bb70 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1bb80 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1bb90 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1bba0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1bbb0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1bbc0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1bbd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bbe0 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1bbf0 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1bc00 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1bc10 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1bc20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1bc30 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1bc40 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1bc50 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1bc60 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1bc70 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1bc80 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1bc90 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1bca0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bcb0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1bcc0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1bcd0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1bce0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bcf0 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1bd00 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1bd10 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1bd20 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bd30 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1bd40 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1bd50 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1bd60 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1bd70 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1bd80 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1bd90 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1bda0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bdb0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1bdc0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1bdd0 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1bde0 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1bdf0 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1be00 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1be10 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1be20 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1be30 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1be40 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1be50 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1be60 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1be70 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1be80 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1be90 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1bea0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1beb0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1bec0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1bed0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1bee0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1bef0 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1bf00 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1bf10 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1bf20 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1bf30 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1bf40 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1bf50 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1bf60 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1bf70 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1bf80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1bf90 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1bfa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1bfb0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1bfc0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1bfd0 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1bfe0 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1bff0 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1c000 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1c010 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1c020 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1c030 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1c040 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1c050 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1c060 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1c070 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1c080 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1c090 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1c0a0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1c0b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1c0c0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1c0d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c0e0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1c0f0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1c100 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c110 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1c120 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1c130 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1c140 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1c150 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1c160 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1c170 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1c180 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1c190 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1c1a0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1c1b0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1c1c0 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1c1d0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1c1e0 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1c1f0 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1c200 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1c210 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1c220 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1c230 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1c240 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1c250 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1c260 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1c270 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1c280 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1c290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c2a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1c2b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1c2c0 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1c2d0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1c2e0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1c2f0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1c300 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c320 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1c330 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1c340 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c350 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1c360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c370 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1c380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c390 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1c3a0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1c3b0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1c3c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c3d0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1c3e0 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1c3f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c400 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c410 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1c420 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1c430 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1c440 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1c450 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1c460 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1c470 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1c480 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1c490 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1c4a0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1c4b0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1c4c0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1c4d0 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1c4e0 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1c4f0 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1c500 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1c510 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1c520 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1c530 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1c540 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a  rom journal */..
1c550 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1c560 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1c570 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1c580 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1c590 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1c5a0 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1c5b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1c5c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1c5d0 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1c5e0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c5f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1c600 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1c620 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1c640 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1c650 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1c660 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1c670 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1c680 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1c690 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1c6a0 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1c6b0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1c6c0 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1c6d0 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1c6e0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1c6f0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1c700 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1c710 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1c720 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1c730 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1c740 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1c750 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1c760 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1c770 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1c780 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1c790 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1c7a0 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1c7b0 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1c7c0 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1c7d0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c7e0 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1c7f0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1c800 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1c810 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1c820 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1c830 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1c840 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1c850 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1c860 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c870 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1c880 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c890 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c8a0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c8b0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c8c0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1c8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1c8e0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1c8f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1c900 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1c910 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1c920 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1c930 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1c940 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1c950 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1c960 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1c970 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1c980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c990 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1c9a0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1c9b0 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1c9c0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1c9d0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1c9e0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1c9f0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1ca00 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1ca10 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1ca20 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1ca30 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1ca40 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1ca50 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1ca60 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1ca70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1ca80 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1ca90 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1caa0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1cab0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1cac0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1cad0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1cae0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1caf0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1cb00 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1cb10 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1cb20 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1cb30 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1cb40 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1cb50 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1cb60 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1cb70 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1cb80 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1cb90 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1cba0 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1cbb0 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1cbc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1cbd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cbe0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1cbf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cc00 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1cc10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cc20 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1cc30 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1cc40 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1cc50 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1cc60 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1cc70 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1cc80 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1cc90 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1cca0 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1ccb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1ccc0 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1ccd0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1cce0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1ccf0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1cd00 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1cd10 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1cd20 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1cd30 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1cd40 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1cd50 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1cd60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cd70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1cd80 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1cd90 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1cda0 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1cdb0 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1cdc0 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1cdd0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1cde0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1cdf0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1ce00 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1ce10 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1ce20 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1ce30 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1ce40 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1ce50 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1ce60 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1ce70 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1ce80 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1ce90 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1cea0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1ceb0 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1cec0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1ced0 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1cee0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1cef0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1cf00 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1cf10 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1cf20 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1cf30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cf40 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1cf50 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1cf60 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1cf70 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1cf80 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1cf90 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1cfa0 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1cfb0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1cfc0 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1cfd0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cfe0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1cff0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1d000 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1d010 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1d020 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1d030 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1d040 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1d050 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1d060 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1d070 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1d080 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1d090 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1d0a0 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1d0b0 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1d0c0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1d0d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1d0e0 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1d0f0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1d100 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1d110 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1d120 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1d130 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1d140 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d150 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1d160 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d170 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1d180 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1d190 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1d1a0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1d1b0 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1d1c0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1d1d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1d1e0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1d1f0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1d200 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1d210 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1d220 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d230 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1d240 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1d250 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1d260 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d270 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1d280 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1d290 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1d2a0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1d2b0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d2c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d2d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d2e0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1d2f0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1d300 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1d310 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1d320 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1d330 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1d340 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1d350 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1d360 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1d370 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1d380 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1d390 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1d3a0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1d3b0 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1d3c0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1d3d0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1d3e0 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1d3f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1d400 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d410 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1d420 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1d430 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1d440 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1d450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d460 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1d470 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  k++;.      }else
1d480 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
1d490 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1d4a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1d4b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1d4c0 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
1d4d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1d4e0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1d4f0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1d500 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1d510 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1d520 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
1d530 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
1d540 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
1d550 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1d560 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
1d570 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
1d580 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
1d590 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
1d5a0 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
1d5b0 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
1d5c0 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
1d5d0 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
1d5e0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1d5f0 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
1d600 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
1d610 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
1d620 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
1d630 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
1d640 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
1d650 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
1d660 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
1d670 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1d690 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1d6a0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1d6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d6c0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
1d6d0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1d6e0 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
1d6f0 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
1d700 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
1d710 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1d720 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
1d730 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
1d740 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
1d750 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
1d760 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
1d770 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
1d780 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
1d790 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
1d7a0 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
1d7b0 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
1d7c0 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
1d7d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1d7e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d7f0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d800 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d810 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
1d820 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
1d830 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
1d840 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
1d850 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1d860 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1d870 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1d880 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1d890 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1d8a0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1d8b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1d8c0 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1d8d0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1d8e0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1d8f0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1d900 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1d910 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1d920 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1d930 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1d940 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1d950 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1d960 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1d970 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1d980 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ds ){.    sqlite
1d990 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
1d9a0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  nt(pPager->fd,SQ
1d9b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d9c0 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a  CHANGED,0);.  }.
1d9d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1d9e0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1d9f0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1da00 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1da10 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1da20 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1da30 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1da40 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1da50 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1da60 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1da70 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1da80 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1da90 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1daa0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1dab0 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1dac0 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1dad0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1dae0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1daf0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1db00 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1db10 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1db20 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1db30 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1db40 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1db50 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1db60 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1db70 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1db80 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1db90 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1dba0 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1dbb0 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1dbc0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1dbd0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1dbe0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1dbf0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1dc00 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1dc10 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1dc20 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1dc30 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1dc40 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1dc50 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1dc60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dc70 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1dc80 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1dc90 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1dca0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1dcb0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1dcc0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1dcd0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1dce0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1dcf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1dd00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dd10 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1dd20 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1dd30 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1dd40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1dd50 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1dd60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dd70 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1dd80 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 0);.  }.  if(
1dd90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dda0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1ddb0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1ddc0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1ddd0 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1dde0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1ddf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1de00 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1de10 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1de20 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1de30 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1de40 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1de50 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1de60 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1de70 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1de80 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1de90 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1dea0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1deb0 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1dec0 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1ded0 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1dee0 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1def0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1df00 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1df10 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1df20 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1df30 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1df40 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1df50 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1df60 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1df70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1df80 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1df90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1dfa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1dfb0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1dfc0 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1dfd0 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1dfe0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1dff0 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1e000 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1e010 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1e020 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1e030 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1e040 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1e050 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1e060 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1e070 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1e080 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1e090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1e0a0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1e0b0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1e0c0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1e0d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
1e0e0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1e0f0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1e100 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1e110 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1e120 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1e130 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1e140 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1e160 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1e170 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1e180 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1e190 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1e1a0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1e1b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e1c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1e1d0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1e1e0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1e1f0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1e200 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1e210 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e220 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e230 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e240 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1e250 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61  r *pPg, u32 iFra
1e260 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  me){.  Pager *pP
1e270 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e280 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1e290 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1e2a0 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1e2b0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1e2c0 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1e2d0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1e2e0 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1e2f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1e300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1e310 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1e320 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70  pgsz = pPager->p
1e330 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62  ageSize; /* Numb
1e340 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
1e350 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
1e360 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1e370 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1e380 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1e390 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1e3a0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66  ger->fd) );..#if
1e3b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e3c0 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d  _WAL.  if( iFram
1e3d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20  e ){.    /* Try 
1e3e0 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65  to pull the page
1e3f0 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
1e400 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20  ahead log. */.  
1e410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e420 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65  lReadFrame(pPage
1e430 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c  r->pWal, iFrame,
1e440 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74   pgsz, pPg->pDat
1e450 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  a);.  }else.#end
1e460 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69  if.  {.    i64 i
1e470 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1e480 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1e490 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1e4a0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1e4b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1e4c0 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1e4d0 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1e4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1e4f0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1e500 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e510 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1e520 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1e530 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1e540 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1e550 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1e560 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1e570 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1e580 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1e590 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1e5a0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1e5b0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1e5c0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1e5d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1e5e0 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1e5f0 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1e600 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1e610 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1e620 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1e630 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1e640 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1e650 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1e660 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1e670 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1e680 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1e690 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1e6a0 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1e6b0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1e6c0 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1e6d0 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1e6e0 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1e6f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e700 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1e710 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1e720 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1e730 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1e740 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1e750 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1e760 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1e770 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1e780 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1e790 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20   ** white noise 
1e7a0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1e7b0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1e7c0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1e7d0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1e7e0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1e7f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e800 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1e810 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1e820 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1e830 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1e840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e850 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1e860 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1e870 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1e880 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1e890 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1e8a0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1e8b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e8c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1e8d0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1e8e0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1e8f0 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1e900 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20  NOMEM_BKPT);..  
1e910 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1e920 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1e930 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1e940 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1e950 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1e960 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1e970 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1e980 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1e990 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1e9a0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1e9c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1e9d0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1e9e0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1e9f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ea00 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1ea10 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1ea20 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1ea30 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1ea40 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1ea50 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1ea60 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1ea70 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1ea80 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1ea90 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1eaa0 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1eab0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1eac0 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1ead0 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1eae0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1eaf0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1eb00 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1eb10 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1eb20 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1eb30 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1eb40 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1eb50 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1eb60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1eb70 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1eb80 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1eb90 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1eba0 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1ebb0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1ebc0 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1ebd0 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1ebe0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1ebf0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1ec00 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1ec10 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1ec20 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1ec30 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1ec40 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1ec50 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1ec60 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1ec70 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1ec80 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1ec90 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1eca0 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1ecb0 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1ecc0 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1ecd0 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1ece0 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1ecf0 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1ed00 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1ed10 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1ed20 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1ed30 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1ed40 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1ed50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1ed60 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1ed70 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1ed80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1ed90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1eda0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1edb0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1edc0 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1edd0 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1ede0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1edf0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1ee00 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1ee10 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1ee20 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1ee30 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1ee40 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1ee50 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1ee60 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1ee70 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1ee80 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1ee90 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1eea0 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1eeb0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1eec0 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1eed0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1eee0 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1eef0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1ef00 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1ef10 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1ef20 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1ef30 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1ef40 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1ef50 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1ef60 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1ef70 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1ef80 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1ef90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1efa0 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1efb0 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1efc0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1efd0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1efe0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1eff0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1f000 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1f010 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1f020 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f030 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1f040 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1f050 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1f060 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
1f070 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f080 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73  er) );.  pPg = s
1f090 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1f0a0 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a  p(pPager, iPg);.
1f0b0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
1f0c0 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1f0d0 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
1f0e0 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Pg)==1 ){.      
1f0f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
1f100 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  p(pPg);.    }els
1f110 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46 72  e{.      u32 iFr
1f120 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ame = 0;.      r
1f130 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
1f140 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
1f150 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pWal, pPg->pgno,
1f160 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
1f170 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f190 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1f1a0 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  g, iFrame);.    
1f1b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1f1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f1d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
1f1e0 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
1f1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f200 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
1f210 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20  tNull(pPg);.    
1f220 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1f230 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1f240 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1f250 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1f260 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1f270 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1f280 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1f290 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1f2a0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1f2b0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1f2c0 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1f2d0 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1f2e0 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1f2f0 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1f300 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1f310 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1f320 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1f330 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1f340 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1f350 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1f360 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1f370 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1f380 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1f390 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1f3a0 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1f3b0 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1f3c0 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1f3d0 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1f3e0 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1f3f0 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1f400 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1f410 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1f420 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1f430 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f440 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f450 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1f460 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1f470 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1f480 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1f490 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1f4a0 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1f4b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f4e0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1f4f0 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1f500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1f510 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1f520 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1f530 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1f540 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1f550 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1f560 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1f570 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1f580 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1f590 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1f5a0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1f5b0 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1f5c0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1f5d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1f5e0 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1f5f0 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1f600 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1f610 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1f620 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1f630 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1f640 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1f650 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1f660 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1f670 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1f680 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1f690 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1f6a0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1f6b0 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1f6c0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1f6d0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1f6e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1f6f0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f700 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
1f710 54 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  T.  /* If this i
1f720 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  s an CONCURRENT 
1f730 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1f740 6e 20 70 61 67 65 20 31 20 6d 75 73 74 20 62 65  n page 1 must be
1f750 20 72 65 72 65 61 64 20 66 72 6f 6d 20 0a 20 20   reread from .  
1f760 2a 2a 20 74 68 65 20 64 62 20 66 69 6c 65 2c 20  ** the db file, 
1f770 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
1f780 74 20 64 69 72 74 79 2e 20 54 68 69 73 20 69 73  t dirty. This is
1f790 20 62 65 63 61 75 73 65 20 74 68 65 20 62 2d 74   because the b-t
1f7a0 72 65 65 20 6c 61 79 65 72 20 0a 20 20 2a 2a 20  ree layer .  ** 
1f7b0 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  may have already
1f7c0 20 7a 65 72 6f 65 64 20 74 68 65 20 6e 46 72 65   zeroed the nFre
1f7d0 65 20 61 6e 64 20 69 54 72 75 6e 6b 20 68 65 61  e and iTrunk hea
1f7e0 64 65 72 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a  der fields.  */.
1f7f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f800 5f 4f 4b 20 26 26 20 28 70 4c 69 73 74 3d 3d 30  _OK && (pList==0
1f810 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 21   || pList->pgno!
1f820 3d 31 29 20 26 26 20 70 50 61 67 65 72 2d 3e 70  =1) && pPager->p
1f830 41 6c 6c 52 65 61 64 20 29 7b 0a 20 20 20 20 72  AllRead ){.    r
1f840 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1f850 6c 62 61 63 6b 28 28 76 6f 69 64 2a 29 70 50 61  lback((void*)pPa
1f860 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e  ger, 1);.  }.#en
1f870 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c  dif..  while( pL
1f880 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1f890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1f8a0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1f8b0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1f8c0 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1f8d0 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1f8e0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1f8f0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1f900 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1f910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f930 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1f940 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1f950 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1f960 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1f970 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1f980 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1f990 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1f9a0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1f9b0 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1f9c0 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1f9d0 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1f9e0 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1f9f0 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1fa00 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1fa10 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1fa20 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1fa30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1fa40 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1fa50 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1fa60 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1fa70 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1fa80 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1fa90 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1faa0 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1fab0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fac0 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1fad0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1faf0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1fb00 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1fb30 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1fb40 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1fb70 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1fb80 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1fb90 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fbb0 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1fbc0 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1fbd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fbf0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1fc00 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1fc30 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20  es in pList */. 
1fc40 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1fc70 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20  over pages */.. 
1fc80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fc90 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1fca0 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1fcb0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1fcc0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1fcd0 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1fce0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1fcf0 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1fd00 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1fd10 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1fd20 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1fd30 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1fd40 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1fd50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1fd60 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1fd70 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1fd80 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1fd90 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1fda0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1fdb0 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1fdc0 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1fdd0 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1fde0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1fdf0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1fe00 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1fe10 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1fe20 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1fe30 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1fe40 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1fe50 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1fe60 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1fe70 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1fe80 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1fe90 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  /.    PgHdr **pp
1fea0 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1feb0 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1fec0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1fed0 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1fee0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1fef0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1ff00 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1ff10 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1ff20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1ff30 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1ff40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1ff50 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1ff60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1ff70 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1ff80 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1ff90 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1ffa0 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1ffb0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1ffc0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1ffd0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1ffe0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fff0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
20000 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
20010 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
20020 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
20030 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
20040 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
20050 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
20060 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
20070 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
20080 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
20090 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
200a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
200b0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
200c0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
200d0 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
200e0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
200f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
20100 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
20110 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
20120 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
20130 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20140 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
20150 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
20160 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
20170 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
20180 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
20190 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
201a0 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
201b0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
201c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
201d0 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
201e0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
201f0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
20200 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
20210 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
20220 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
20230 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
20240 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
20250 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
20260 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
20270 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
20280 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
20290 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
202a0 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
202b0 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
202c0 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
202d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
202e0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
202f0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
20300 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
20310 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
20320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20330 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
20340 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20360 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
20370 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
20380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
20390 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
203a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
203b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
203c0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
203d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
203e0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
203f0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
20400 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
20410 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
20420 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
20430 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20440 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
20450 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
20460 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
20470 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
20480 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
20490 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
204a0 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
204b0 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
204c0 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
204d0 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
204e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
204f0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
20500 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
20510 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
20520 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
20530 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
20540 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
20550 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
20560 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
20570 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
20580 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
20590 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
205a0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
205b0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
205c0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
205d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
205e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
205f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
20600 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
20610 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
20620 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
20630 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
20640 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
20650 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
20660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20670 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
20680 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
20690 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
206a0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
206b0 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
206c0 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
206d0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
206e0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
206f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20700 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
20710 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
20720 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
20730 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
20740 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
20750 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
20760 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
20770 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
20780 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
20790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
207a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
207b0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
207c0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
207d0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207f0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
20800 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
20810 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
20820 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
20830 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
20840 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
20850 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
20860 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
20870 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
20880 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
20890 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
208a0 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
208b0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
208c0 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
208d0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
208e0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
208f0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
20900 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
20910 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
20920 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
20930 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
20940 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
20950 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
20960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20970 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
20980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20990 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
209a0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
209b0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
209c0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
209d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
209e0 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e  mpFile==0 );.  n
209f0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
20a00 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
20a10 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
20a20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
20a30 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
20a40 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
20a50 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
20a60 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
20a70 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
20a80 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73   page counte bas
20a90 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
20aa0 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
20ab0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20ac0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20ad0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
20ae0 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
20af0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
20b00 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
20b10 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
20b20 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
20b30 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  age==0 && ALWAYS
20b40 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  (isOpen(pPager->
20b50 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20  fd)) ){.    i64 
20b60 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
20b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20b80 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
20b90 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
20ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
20bb0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
20bc0 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  fd, &n);.    if(
20bd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
20bf0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
20c00 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
20c10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
20c20 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
20c30 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
20c40 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20c50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
20c60 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
20c70 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
20c80 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
20c90 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
20ca0 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
20cb0 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
20cc0 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
20cd0 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
20ce0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
20cf0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
20d00 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
20d10 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
20d20 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
20d30 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
20d40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20d50 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
20d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
20d70 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
20d80 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
20d90 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
20da0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20db0 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
20dc0 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
20dd0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20de0 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
20df0 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
20e00 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
20e10 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
20e20 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
20e30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20e40 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
20e50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20e60 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
20e70 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
20e80 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
20e90 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
20ea0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
20eb0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
20ec0 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
20ed0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
20ee0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
20ef0 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
20f00 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
20f10 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
20f20 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20f30 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
20f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20f50 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
20f60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
20f70 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
20f80 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
20f90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20fa0 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
20fb0 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
20fc0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
20fd0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
20fe0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
20ff0 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
21000 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
21010 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
21020 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
21030 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
21040 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
21050 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
21060 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
21070 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
21080 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
21090 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
210a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
210b0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
210c0 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
210d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
210e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
210f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
21100 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
21110 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
21120 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
21130 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
21140 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
21150 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
21160 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
21170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21180 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
21190 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
211a0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
211b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
211c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
211d0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
211e0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
211f0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
21200 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
21210 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
21220 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
21230 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21240 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
21250 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
21260 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
21270 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21280 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
21290 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ENT ) rc = SQLIT
212a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61  E_OK;.      isWa
212b0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
212c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
212d0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
212e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
212f0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
21300 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
21310 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
21320 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
21330 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
21350 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
21360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
21370 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
21380 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
21390 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
213a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
213b0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
213c0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
213d0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
213e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
213f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21400 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WAL ){.        p
21410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
21420 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
21430 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20  ALMODE_DELETE;. 
21440 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21460 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c  #endif../*.** Pl
21470 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  ayback savepoint
21480 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c   pSavepoint. Or,
21490 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d   if pSavepoint==
214a0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62  NULL, then playb
214b0 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  ack.** the entir
214c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
214d0 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20   file. The case 
214e0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
214f0 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a   occurs when .**
21500 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63   a ROLLBACK TO c
21510 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65  ommand is invoke
21520 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54  d on a SAVEPOINT
21530 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73   that is a trans
21540 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70  action .** savep
21550 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oint..**.** When
21560 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e   pSavepoint is n
21570 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67  ot NULL (meaning
21580 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69   a non-transacti
21590 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
215a0 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  .** being rolled
215b0 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65   back), then the
215c0 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   rollback consis
215d0 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65  ts of up to thre
215e0 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72  e stages,.** per
215f0 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72  formed in the or
21600 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a  der specified:.*
21610 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
21620 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  re played back f
21630 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
21640 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
21650 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66   byte.**     off
21660 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  set PagerSavepoi
21670 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
21680 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a  ontinuing to .**
21690 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
216a0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20  int.iHdrOffset, 
216b0 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
216c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
216d0 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66  l.**     file if
216e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
216f0 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65  iHdrOffset is ze
21700 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ro..**.**   * If
21710 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21720 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f  iHdrOffset is no
21730 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67  t zero, then pag
21740 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a  es are played.**
21750 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69       back starti
21760 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
21770 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64  nal header immed
21780 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
21790 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
217a0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
217b0 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  et to the end of
217c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
217d0 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  l file..**.**   
217e0 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e  * Pages are then
217f0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
21800 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
21810 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67  l file, starting
21820 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65  .**     with the
21830 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21840 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74  iSubRec and cont
21850 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e  inuing to the en
21860 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20  d of.**     the 
21870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
21880 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74  .** Throughout t
21890 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63  he rollback proc
218a0 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61  ess, each time a
218b0 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20   page is rolled 
218c0 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72  back, the.** cor
218d0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
218e0 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65  s set in a bitve
218f0 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72  c structure (var
21900 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74  iable pDone in t
21910 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
21920 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69  tion below). Thi
21930 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73  s is used to ens
21940 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20  ure that a page 
21950 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65  is only.** rolle
21960 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74  d back the first
21970 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
21980 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65  untered in eithe
21990 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  r journal..**.**
219a0 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69   If pSavepoint i
219b0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67  s NULL, then pag
219c0 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79  es are only play
219d0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
219e0 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
219f0 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20   file. There is 
21a00 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  no need for a bi
21a10 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73  tvec in this cas
21a20 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  e..**.** In eith
21a30 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20  er case, before 
21a40 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63  playback commenc
21a50 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53  es the Pager.dbS
21a60 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
21a70 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20  is reset to the 
21a80 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65  value that it he
21a90 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ld at the start 
21aa0 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
21ab0 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63   .** (or transac
21ac0 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77  tion). No page w
21ad0 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65  ith a page-numbe
21ae0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
21af0 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  his value.** is 
21b00 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20  played back. If 
21b10 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  one is encounter
21b20 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20  ed it is simply 
21b30 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
21b40 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79  ic int pagerPlay
21b50 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61  backSavepoint(Pa
21b60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67  ger *pPager, Pag
21b70 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
21b80 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20  vepoint){.  i64 
21b90 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
21ba0 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76       /* Effectiv
21bb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
21bc0 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
21bd0 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
21be0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
21bf0 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74  of first segment
21c00 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c   of main-journal
21c10 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   records */.  in
21c20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21c30 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
21c40 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65   code */.  Bitve
21c50 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20  c *pDone = 0;   
21c60 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f      /* Bitvec to
21c70 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c   ensure pages pl
21c80 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f  ayed back only o
21c90 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  nce */..  assert
21ca0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
21cb0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
21cc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21cd0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
21ce0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
21cf0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
21d00 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
21d10 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
21d20 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
21d30 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
21d40 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21d50 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
21d60 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
21d70 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
21d80 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
21d90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21da0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
21db0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
21dc0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
21dd0 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
21de0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
21df0 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
21e00 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
21e10 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
21e20 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
21e30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
21e40 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
21e50 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
21e60 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
21e70 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
21e80 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
21e90 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
21ea0 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76  le;..  if( !pSav
21eb0 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55  epoint && pagerU
21ec0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
21ee0 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61  rRollbackWal(pPa
21ef0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
21f00 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
21f10 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
21f20 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
21f30 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
21f40 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
21f50 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
21f60 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
21f70 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
21f80 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
21f90 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
21fa0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
21fb0 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
21fc0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
21fd0 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
21fe0 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
21ff0 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
22000 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
22010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61  >journalOff;.  a
22020 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
22030 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
22040 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a   szJ==0 );..  /*
22050 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
22060 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
22070 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
22080 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
22090 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
220a0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
220b0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
220c0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
220d0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
220e0 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
220f0 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
22100 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
22110 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
22120 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
22130 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
22140 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
22150 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
22160 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
22170 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
22180 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
22190 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
221a0 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
221b0 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
221c0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
221d0 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67  avepoint && !pag
221e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
221f0 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
22200 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
22210 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
22220 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
22230 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
22240 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22250 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
22260 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
22270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22280 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
22290 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
222a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
222b0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
222c0 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
222d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
222e0 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
222f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22300 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
22310 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
22320 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22330 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
22340 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
22350 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
22360 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
22370 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
22380 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
22390 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
223a0 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
223b0 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
223c0 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
223d0 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
223e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
223f0 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
22400 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
22410 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
22420 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
22430 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
22440 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
22450 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
22460 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
22470 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
22480 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
22490 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
224a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
224b0 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
224c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
224d0 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
224e0 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
224f0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
22500 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
22510 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
22520 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
22530 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22540 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
22550 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
22560 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
22570 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
22580 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
22590 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
225a0 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
225b0 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
225c0 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
225d0 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
225e0 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
225f0 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
22600 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
22610 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
22620 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
22630 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
22640 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
22650 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
22660 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
22670 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
22680 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
22690 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
226a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
226b0 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
226c0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
226d0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
226e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
226f0 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
22700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
22710 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
22720 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
22730 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
22740 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
22750 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
22760 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
22770 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22780 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
22790 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
227a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
227b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73  r->journalOff>=s
227c0 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
227d0 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
227e0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
227f0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
22800 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
22810 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
22820 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
22830 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
22840 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
22850 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
22860 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
22870 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
22880 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
22890 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
228a0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
228b0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
228c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
228d0 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
228e0 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61  ffset = (i64)pSa
228f0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
22900 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
22910 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
22920 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
22930 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
22940 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
22950 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
22960 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
22970 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
22980 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
22990 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
229a0 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
229b0 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
229c0 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
229d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
229e0 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28  ffset==(i64)ii*(
229f0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
22a00 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
22a10 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
22a20 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
22a30 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
22a40 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
22a50 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22a60 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
22a70 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
22a80 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
22a90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
22ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22ac0 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
22ad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22ae0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
22af0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
22b00 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
22b10 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a  hat are allowed.
22b20 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ** before attemp
22b30 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20  ting to recycle 
22b40 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64  clean and unused
22b50 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   pages..*/.void 
22b60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
22b70 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
22b80 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
22b90 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
22ba0 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
22bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22bc0 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
22bd0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
22be0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
22bf0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
22c00 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
22c10 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65  d.** before atte
22c20 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20  mpting to spill 
22c30 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c  pages to journal
22c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22c50 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
22c60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22c70 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22c80 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
22c90 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65  acheSetSpillsize
22ca0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22cb0 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
22cc0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54  .** Invoke SQLIT
22cd0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
22ce0 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  E based on the c
22cf0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
22d00 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69  szMmap..*/.stati
22d10 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d  c void pagerFixM
22d20 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  aplimit(Pager *p
22d30 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49  Pager){.#if SQLI
22d40 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
22d50 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  >0.  sqlite3_fil
22d60 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e  e *fd = pPager->
22d70 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  fd;.  if( isOpen
22d80 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74  (fd) && fd->pMet
22d90 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
22da0 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
22db0 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73  _int64 sz;.    s
22dc0 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  z = pPager->szMm
22dd0 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ap;.    pPager->
22de0 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e  bUseFetch = (sz>
22df0 30 29 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  0);.    setGette
22e00 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
22e10 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
22e20 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
22e30 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
22e40 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
22e50 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64  , &sz);.  }.#end
22e60 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  if.}../*.** Chan
22e70 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ge the maximum s
22e80 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72  ize of any memor
22e90 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f  y mapping made o
22ea0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22eb0 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
22ec0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
22ed0 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  Limit(Pager *pPa
22ee0 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ger, sqlite3_int
22ef0 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50  64 szMmap){.  pP
22f00 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73  ager->szMmap = s
22f10 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69  zMmap;.  pagerFi
22f20 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
22f30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
22f40 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
22f50 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
22f60 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76   the pager..*/.v
22f70 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22f80 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50  Shrink(Pager *pP
22f90 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
22fa0 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61  PcacheShrink(pPa
22fb0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
22fc0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73  ../*.** Adjust s
22fd0 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70  ettings of the p
22fe0 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70  ager to those sp
22ff0 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70  ecified in the p
23000 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  gFlags parameter
23010 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76  ..**.** The "lev
23020 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26  el" in pgFlags &
23030 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
23040 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65  US_MASK sets the
23050 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f   robustness.** o
23060 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
23070 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
23080 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f  OS crashes or po
23090 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a  wer failures by.
230a0 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ** changing the 
230b0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
230c0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  )s when writing 
230d0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  the journals..**
230e0 20 54 68 65 72 65 20 61 72 65 20 66 6f 75 72 20   There are four 
230f0 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
23100 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
23110 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
23120 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
23130 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
23140 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23150 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
23160 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
23170 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
23180 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
23190 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
231a0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
231b0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
231d0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
231e0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
231f0 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
23200 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23210 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
23220 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
23230 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
23240 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
23250 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
23260 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
23270 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
23280 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
23290 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
232a0 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
232b0 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
232c0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
232d0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
232e0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
232f0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
23300 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
23310 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
23320 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
23330 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
23340 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
23350 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
23360 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
23370 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
23380 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
23390 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
233a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
233b0 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
233c0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
233d0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
233e0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
233f0 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
23400 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
23410 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
23420 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
23430 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
23440 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
23450 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
23460 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
23470 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
23480 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
23490 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
234b0 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
234c0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
234d0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
234e0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  back..**.**    E
234f0 58 54 52 41 20 20 20 20 20 54 68 69 73 20 69 73  XTRA     This is
23500 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70   like FULL excep
23510 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73  t that is also s
23520 79 6e 63 73 20 74 68 65 20 64 69 72 65 63 74 6f  yncs the directo
23530 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ry.**           
23540 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73     that contains
23550 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
23560 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20  urnal after the 
23570 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20  rollback.**     
23580 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
23590 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a   is unlinked..**
235a0 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
235b0 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
235c0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
235d0 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
235e0 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
235f0 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
23600 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
23610 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
23620 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
23630 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
23640 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
23650 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
23660 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
23670 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
23680 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
23690 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
236a0 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
236b0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
236c0 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
236d0 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
236e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
236f0 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
23700 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
23710 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
23720 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
23730 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
23740 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
23750 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
23760 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
23770 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
23780 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
23790 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
237a0 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
237b0 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54   with NORMAL.  T
237c0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
237d0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55  rence between FU
237e0 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20  LL.** and EXTRA 
237f0 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a  for WAL mode..**
23800 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
23810 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
23820 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
23830 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
23840 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
23850 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
23860 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
23870 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
23880 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
23890 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
238a0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
238b0 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
238c0 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
238d0 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
238e0 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
238f0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
23900 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
23910 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
23920 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
23930 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
23940 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
23950 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
23960 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
23970 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
23980 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
23990 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
239a0 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
239b0 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
239c0 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
239d0 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
239e0 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
239f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23a00 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
23a10 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
23a20 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
23a30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
23a40 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
23a50 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
23a60 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
23a70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
23a80 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23a90 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66  pager to set saf
23aa0 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f  ety level for */
23ab0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
23ac0 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ags      /* Vari
23ad0 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  ous flags */.){.
23ae0 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c    unsigned level
23af0 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47   = pgFlags & PAG
23b00 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
23b10 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ASK;.  if( pPage
23b20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
23b30 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
23b40 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
23b50 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b  r->fullSync = 0;
23b60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
23b70 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  raSync = 0;.  }e
23b80 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23b90 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
23ba0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
23bb0 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20  OUS_OFF ?1:0;.  
23bc0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
23bd0 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45  nc = level>=PAGE
23be0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55  R_SYNCHRONOUS_FU
23bf0 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  LL ?1:0;.    pPa
23c00 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
23c10 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59   level==PAGER_SY
23c20 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20  NCHRONOUS_EXTRA 
23c30 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ?1:0;.  }.  if( 
23c40 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
23c50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23c60 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ncFlags = 0;.   
23c70 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23c80 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
23c90 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
23ca0 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e  & PAGER_FULLFSYN
23cb0 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
23cc0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23cd0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
23ce0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
23cf0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23d00 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
23d10 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73  else if( pgFlags
23d20 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55   & PAGER_CKPT_FU
23d30 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
23d40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23d50 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
23d60 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
23d70 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
23d80 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
23d90 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
23da0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23db0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23dc0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
23dd0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23de0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23df0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
23e00 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23e10 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
23e20 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
23e30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
23e40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23e50 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
23e60 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
23e70 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28  TIONS;.  }.  if(
23e80 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23e90 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20  _CACHESPILL ){. 
23ea0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23eb0 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
23ec0 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  LAG_OFF;.  }else
23ed0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
23ee0 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
23ef0 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d  LFLAG_OFF;.  }.}
23f00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
23f10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
23f20 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
23f30 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
23f40 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
23f50 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
23f60 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
23f70 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
23f80 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
23f90 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
23fa0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
23fb0 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
23fc0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
23fd0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
23fe0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
23ff0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
24000 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
24010 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
24020 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24030 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
24040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
24050 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
24060 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
24070 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
24080 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
24090 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
240a0 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
240b0 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
240c0 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
240d0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
240e0 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
240f0 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
24100 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
24110 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
24120 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
24130 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
24140 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
24150 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
24160 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
24170 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
24180 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
24190 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
241a0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
241b0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
241c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
241d0 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
241e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
241f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
24200 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
24210 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
24220 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
24230 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24240 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
24250 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
24260 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
24270 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
24280 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
24290 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
242a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
242b0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
242c0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
242d0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
242e0 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
242f0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
24300 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
24310 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
24320 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
24330 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
24340 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
24350 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
24360 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
24370 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
24380 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
24390 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
243a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
243b0 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
243c0 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
243d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
243e0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
243f0 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
24400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
24410 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
24420 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
24430 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
24440 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
24450 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
24460 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
24470 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
24480 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
24490 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
244a0 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
244b0 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
244c0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
244d0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
244e0 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
244f0 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
24500 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
24510 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
24520 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
24530 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
24540 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
24550 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
24560 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
24570 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
24580 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
24590 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
245a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
245b0 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
245c0 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
245f0 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
24600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24630 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
24640 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
24650 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
24660 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
24670 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
24680 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
24690 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
246a0 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
246b0 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
246c0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
246d0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
246e0 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
246f0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
24700 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
24710 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
24720 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
24730 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
24740 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
24750 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
24760 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
24770 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
24780 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
24790 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
247a0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
247b0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
247c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
247d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
247f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
24800 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
24810 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
24820 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
24830 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
24840 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
24850 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24870 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
24880 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
24890 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ler */.){.  pPag
248a0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
248b0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
248c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
248d0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
248e0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20  syHandlerArg;.. 
248f0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
24900 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76  er->fd) ){.    v
24910 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64  oid **ap = (void
24920 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75   **)&pPager->xBu
24930 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61  syHandler;.    a
24940 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28  ssert( ((int(*)(
24950 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29  void *))(ap[0]))
24960 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29  ==xBusyHandler )
24970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
24980 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65  [1]==pBusyHandle
24990 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69  rArg );.    sqli
249a0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
249b0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
249c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55   SQLITE_FCNTL_BU
249d0 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64  SYHANDLER, (void
249e0 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   *)ap);.  }.}../
249f0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
24a00 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
24a10 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
24a20 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
24a30 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
24a40 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
24a50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24a60 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
24a70 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
24a80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24a90 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
24aa0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
24ab0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
24ac0 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
24ad0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
24ae0 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
24af0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
24b00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
24b10 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
24b20 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
24b30 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
24b40 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
24b50 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
24b60 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
24b70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
24b80 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
24b90 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
24ba0 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
24bb0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
24bc0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
24bd0 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
24be0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
24bf0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
24c00 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
24c10 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
24c20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
24c30 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
24c40 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
24c50 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
24c60 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
24c70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
24c80 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
24c90 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
24ca0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
24cb0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
24cc0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
24cd0 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
24ce0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
24cf0 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
24d00 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
24d10 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
24d20 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
24d30 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
24d40 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
24d50 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
24d60 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
24d70 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
24d80 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
24d90 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
24da0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
24db0 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
24dc0 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
24dd0 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
24de0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
24df0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
24e00 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
24e10 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
24e20 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
24e30 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
24e40 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
24e50 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
24e60 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
24e70 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
24e80 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
24e90 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
24ea0 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
24eb0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
24ec0 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
24ed0 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
24ee0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
24ef0 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
24f00 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
24f10 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
24f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
24f30 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
24f40 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
24f50 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
24f60 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
24f70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24f80 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
24f90 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
24fa0 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
24fb0 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
24fc0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
24fd0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
24fe0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
24ff0 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
25000 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
25010 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
25020 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
25030 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
25040 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
25050 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
25060 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
25070 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
25080 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
25090 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
250a0 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
250b0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
250c0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
250d0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
250e0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
250f0 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
25100 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
25110 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
25120 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
25130 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
25140 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
25150 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
25160 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
25170 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
25180 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
25190 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
251a0 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
251b0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
251c0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
251d0 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
251e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
251f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
25200 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
25210 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
25220 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
25230 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
25240 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
25250 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
25260 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
25270 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
25280 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
25290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
252a0 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
252b0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
252c0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
252d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
252e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
252f0 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
25300 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25320 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
25330 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
25340 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
25350 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
25360 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
25370 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
25380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
253a0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
253b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
253c0 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
253d0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
253e0 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
253f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
25400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25410 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25420 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
25430 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
25440 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25450 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
25460 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
25470 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
25480 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
25490 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
254a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
254b0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  ageSize;.    }el
254c0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
254d0 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b  3PageFree(pNew);
254e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
254f0 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
25500 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
25510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25520 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
25530 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
25540 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
25550 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
25560 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
25570 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
25580 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
25590 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
255a0 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
255b0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
255c0 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69  er);.    pagerFi
255d0 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
255e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
255f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
25600 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
25610 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
25620 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
25630 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
25640 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
25650 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
25660 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
25670 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
25680 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
25690 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
256a0 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
256b0 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
256c0 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
256d0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
256e0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
256f0 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
25700 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
25710 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
25720 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
25730 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
25740 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
25750 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
25760 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
25770 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
25780 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
25790 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
257a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
257b0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
257c0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
257d0 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
257e0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
257f0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
25800 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
25810 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
25820 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
25830 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
25840 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
25850 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
25860 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
25870 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
25880 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
25890 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
258a0 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
258b0 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
258c0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
258d0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
258e0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
258f0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
25900 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
25910 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
25920 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
25930 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
25940 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
25950 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
25960 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
25970 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
25980 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
25990 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
259a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
259b0 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
259c0 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
259d0 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
259e0 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
259f0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
25a00 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
25a10 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
25a20 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
25a30 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
25a40 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
25a50 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
25a60 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
25a70 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
25a80 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
25a90 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
25aa0 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
25ab0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
25ac0 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
25ad0 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
25ae0 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
25af0 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
25b00 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
25b10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
25b20 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
25b30 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25b40 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
25b50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
25b60 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
25b70 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
25b80 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
25b90 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
25ba0 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
25bb0 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
25bc0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
25bd0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25be0 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
25bf0 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
25c00 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25c10 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
25c20 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25c30 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
25c40 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
25c50 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
25c60 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
25c70 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
25c80 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25c90 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
25ca0 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
25cb0 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
25cc0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
25cd0 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
25ce0 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
25cf0 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
25d00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
25d10 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
25d20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
25d30 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
25d40 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
25d50 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
25d60 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
25d70 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
25d80 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
25d90 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
25da0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
25db0 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
25dc0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
25dd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
25de0 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
25df0 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
25e00 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
25e10 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
25e20 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
25e30 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
25e40 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
25e50 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
25e60 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
25e70 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
25e80 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
25e90 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
25ea0 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
25eb0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25ec0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
25ed0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
25ee0 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
25ef0 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
25f00 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
25f10 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
25f20 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
25f30 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
25f40 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
25f50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25f60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
25f70 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
25f80 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
25f90 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
25fa0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25fb0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
25fc0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
25fd0 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
25fe0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
25ff0 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
26000 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
26010 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
26020 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
26030 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
26040 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
26050 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
26060 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
26070 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
26080 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
26090 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
260a0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
260b0 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
260c0 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
260d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
260e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
260f0 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
26100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
26110 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
26120 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26130 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
26140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26150 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26160 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
26170 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
26180 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
26190 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
261a0 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
261b0 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
261c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
261d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
261e0 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
261f0 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
26200 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
26210 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
26220 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
26230 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
26240 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
26250 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
26260 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
26270 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
26280 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
26290 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
262a0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
262b0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
262c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
262d0 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
262e0 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
262f0 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
26300 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
26310 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
26320 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
26330 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
26340 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
26350 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
26360 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
26370 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
26380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26390 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
263a0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
263b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
263c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
263d0 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
263e0 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
263f0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
26400 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
26410 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
26420 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
26430 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
26440 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
26450 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
26460 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
26470 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
26480 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
26490 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
264a0 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
264b0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
264c0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
264d0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
264e0 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
264f0 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
26500 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
26510 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
26520 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
26530 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
26540 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
26550 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
26560 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
26570 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
26580 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
26590 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
265a0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
265e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
265f0 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
26600 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
26610 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
26620 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
26630 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f  eady held), or o
26640 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
26650 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
26660 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
26670 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
26680 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
26690 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
266a0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
266b0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
266c0 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
266d0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
266e0 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
266f0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
26700 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
26710 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
26720 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
26730 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
26740 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
26750 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
26760 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
26770 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
26780 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
26790 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
267a0 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
267b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
267c0 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
267d0 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
267e0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
267f0 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
26800 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
26810 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
26820 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
26830 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
26840 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
26850 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
26860 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
26870 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
26880 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
26890 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
268a0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
268b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
268c0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
268d0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
268e0 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
268f0 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
26900 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
26910 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
26920 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
26930 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
26940 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
26950 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
26960 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
26970 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
26980 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
26990 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
269a0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
269b0 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
269c0 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
269d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
269e0 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
269f0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
26a00 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
26a10 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
26a20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
26a30 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
26a40 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
26a50 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
26a60 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
26a70 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
26a80 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
26a90 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
26aa0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
26ab0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
26ac0 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
26ad0 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
26ae0 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
26af0 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
26b00 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
26b10 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ior would be to 
26b20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
26b30 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
26b40 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
26b50 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
26b60 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
26b70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
26b80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
26b90 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
26ba0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
26bb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
26bc0 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
26bd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
26be0 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
26bf0 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
26c00 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
26c10 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
26c20 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
26c30 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
26c40 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
26c50 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
26c60 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
26c70 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
26c80 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
26c90 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
26ca0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26cb0 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
26cc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
26cd0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
26ce0 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
26cf0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
26d00 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
26d10 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
26d20 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
26d30 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
26d40 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26d50 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
26d60 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
26d70 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
26d80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
26d90 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26da0 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
26db0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
26dc0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26dd0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
26de0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
26df0 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
26e00 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
26e10 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
26e20 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
26e30 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
26e40 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
26e50 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
26e60 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
26e70 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
26e80 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
26e90 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
26ea0 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
26eb0 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
26ec0 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
26ed0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
26ee0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
26ef0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
26f00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26f10 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67   only called rig
26f20 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
26f30 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
26f40 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  on..** Once this
26f50 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
26f60 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74  en called, the t
26f70 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
26f80 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c  either be.** rol
26f90 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  led back or comm
26fa0 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74  itted. It is not
26fb0 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68   safe to call th
26fc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  is function and.
26fd0 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  ** then continue
26fe0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
26ff0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
27000 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
27010 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
27020 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
27030 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
27040 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
27050 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
27060 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
27070 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
27080 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
27090 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
270a0 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74   nPage;..  /* At
270b0 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63   one point the c
270c0 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20  ode here called 
270d0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
270e0 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20  nstraint() to.  
270f0 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  ** ensure that a
27100 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74  ll pages being t
27110 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79  runcated away by
27120 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
27130 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  are,.  ** if one
27140 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
27150 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72  nts are open, pr
27160 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76  esent in the sav
27170 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75  epoint .  ** jou
27180 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  rnal so that the
27190 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
271a0 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69  d if the savepoi
271b0 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a  nt is rolled.  *
271c0 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  * back. This is 
271d0 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73  no longer necess
271e0 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63  ary as this func
271f0 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tion is now only
27200 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67  .  ** called rig
27210 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
27220 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
27230 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20  on. So although 
27240 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
27250 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c  object may still
27260 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70   have open savep
27270 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61  oints (Pager.nSa
27280 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20  vepoint!=0), .  
27290 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62  ** they cannot b
272a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53  e rolled back. S
272b0 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e  o the assertTrun
272c0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
272d0 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f   call.  ** is no
272e0 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e   longer correct.
272f0 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
27300 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
27310 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
27320 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
27330 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
27340 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
27350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
27360 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
27370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
27380 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
27390 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
273a0 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
273b0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
273c0 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
273d0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
273e0 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
273f0 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
27400 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
27410 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
27420 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
27430 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
27440 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
27450 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
27460 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
27470 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
27480 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
27490 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
274a0 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
274b0 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
274c0 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
274d0 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
274e0 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
274f0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
27500 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
27510 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
27520 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27530 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
27540 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
27550 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
27560 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
27570 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
27580 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
27590 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
275a0 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
275b0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
275c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
275d0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
275e0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
275f0 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
27600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27620 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
27630 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
27640 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
27650 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27660 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
27670 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
27680 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  ** Obtain a refe
27690 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72  rence to a memor
276a0 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62  y mapped page ob
276b0 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75  ject for page nu
276c0 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54  mber pgno. .** T
276d0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
276e0 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74  ll use the point
276f0 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e  er pData, obtain
27700 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29  ed from xFetch()
27710 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
27720 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20  ul, set *ppPage 
27730 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
27740 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e  new page referen
27750 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ce.** and return
27760 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
27770 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
27780 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27790 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70  de and set.** *p
277a0 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a  pPage to zero..*
277b0 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65  *.** Page refere
277c0 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79  nces obtained by
277d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
277e0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
277f0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20   released.** by 
27800 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c  calling pagerRel
27810 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  easeMapPage()..*
27820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
27830 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
27840 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
27850 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
27860 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
27870 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ect */.  Pgno pg
27880 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
27890 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
278a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69   number */.  voi
278b0 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  d *pData,       
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278d0 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20  xFetch()'d data 
278e0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
278f0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67  .  PgHdr **ppPag
27900 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
27910 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69     /* OUT: Acqui
27920 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  red page object 
27930 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
27940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27950 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
27960 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f  y mapped page to
27970 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20   return */.  .  
27980 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  if( pPager->pMma
27990 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  pFreelist ){.   
279a0 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70   *ppPage = p = p
279b0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
279c0 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  list;.    pPager
279d0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
279e0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
279f0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
27a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27a10 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b  er->nExtra>=8 );
27a20 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70  .    memset(p->p
27a30 45 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20  Extra, 0, 8);.  
27a40 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
27a50 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
27a60 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
27a70 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
27a80 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
27a90 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
27aa0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27ab0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
27ac0 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
27ad0 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
27ae0 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
27af0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27b00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
27b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
27b20 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
27b30 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c  &p[1];.    p->fl
27b40 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50  ags = PGHDR_MMAP
27b50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
27b60 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72  1;.    p->pPager
27b70 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a   = pPager;.  }..
27b80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78    assert( p->pEx
27b90 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b  tra==(void *)&p[
27ba0 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1] );.  assert( 
27bb0 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  p->pPage==0 );. 
27bc0 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
27bd0 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b  s==PGHDR_MMAP );
27be0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27bf0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
27c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
27c10 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67  f==1 );..  p->pg
27c20 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e  no = pgno;.  p->
27c30 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
27c40 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
27c50 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  t++;..  return S
27c60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
27c70 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
27c80 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
27c90 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d   page pPg. pPg m
27ca0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
27cb0 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a  turned by an .**
27cc0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
27cd0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
27ce0 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
27cf0 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65  c void pagerRele
27d00 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72  aseMapPage(PgHdr
27d10 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
27d20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
27d30 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  Pager;.  pPager-
27d40 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70  >nMmapOut--;.  p
27d50 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
27d60 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27d70 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d  st;.  pPager->pM
27d80 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50  mapFreelist = pP
27d90 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
27da0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
27db0 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
27dc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  );.  sqlite3OsUn
27dd0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
27de0 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  , (i64)(pPg->pgn
27df0 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
27e00 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74  eSize, pPg->pDat
27e10 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  a);.}../*.** Fre
27e20 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65  e all PgHdr obje
27e30 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  cts stored in th
27e40 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65  e Pager.pMmapFre
27e50 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73  elist list..*/.s
27e60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
27e70 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65  FreeMapHdrs(Page
27e80 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
27e90 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20  Hdr *p;.  PgHdr 
27ea0 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
27eb0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27ec0 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78  elist; p; p=pNex
27ed0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
27ee0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73  p->pDirty;.    s
27ef0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
27f00 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68    }.}.../*.** Sh
27f10 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
27f20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
27f30 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
27f40 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
27f50 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
27f60 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
27f70 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
27f80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
27f90 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
27fa0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
27fb0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
27fc0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
27fd0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
27fe0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
27ff0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
28000 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
28010 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
28020 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
28030 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
28040 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28050 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
28060 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
28070 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
28080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
28090 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
280a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
280b0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
280c0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
280d0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
280e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
280f0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
28100 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
28110 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
28120 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
28130 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
28140 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
28150 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
28160 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28170 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
28180 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65   *pPager, sqlite
28190 33 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a 70 54  3 *db){.  u8 *pT
281a0 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
281b0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
281c0 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70   assert( db || p
281d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
281e0 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
281f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28200 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28210 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
28220 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
28230 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
28240 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
28250 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
28260 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
28270 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28280 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
28290 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
282a0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
282b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
282c0 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70 50  assert( db || pP
282d0 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b  ager->pWal==0 );
282e0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
282f0 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
28300 20 64 62 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70   db, pPager->ckp
28310 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
28320 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
28330 20 20 20 20 28 64 62 20 26 26 20 28 64 62 2d 3e      (db && (db->
28340 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e  flags & SQLITE_N
28350 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 3f 20  oCkptOnClose) ? 
28360 30 20 3a 20 70 54 6d 70 29 0a 20 20 29 3b 0a 20  0 : pTmp).  );. 
28370 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
28380 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
28390 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
283a0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
283b0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
283c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
283d0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
283e0 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
283f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
28400 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
28410 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
28420 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
28430 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
28440 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
28450 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
28460 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
28470 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
28480 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
28490 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
284a0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
284b0 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
284c0 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
284d0 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
284e0 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
284f0 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
28500 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
28510 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
28520 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
28530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
28540 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
28550 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
28560 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
28570 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
28580 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
28590 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
285a0 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
285b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
285c0 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
285d0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
285e0 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
285f0 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
28600 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
28610 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
28620 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
28630 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
28640 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
28650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28660 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
28670 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28680 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
28690 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
286a0 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
286b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
286c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
286d0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
286e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
286f0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
28700 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
28710 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28720 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
28730 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
28740 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28750 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
28760 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
28770 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
28780 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
28790 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
287a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
287b0 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
287c0 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
287d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
287e0 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
287f0 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
28800 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28810 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
28820 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
28830 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
28840 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
28850 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
28860 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
28870 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
28880 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
28890 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
288a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
288b0 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
288c0 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
288d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
288e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
288f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
28900 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
28910 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
28920 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
28930 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
28940 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
28950 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
28960 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
28970 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
28980 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
28990 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
289a0 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
289b0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
289c0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
289d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
289e0 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
289f0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
28a00 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
28a10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
28a20 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
28a30 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
28a40 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
28a50 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
28a60 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28a70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
28a80 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
28a90 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
28aa0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
28ab0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
28ac0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
28ad0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
28ae0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
28af0 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
28b00 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
28b10 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28b20 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
28b30 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
28b40 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
28b50 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
28b60 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
28b70 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
28b80 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
28b90 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
28ba0 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
28bb0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
28bc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28bd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
28be0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
28bf0 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
28c00 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
28c10 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
28c20 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
28c30 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
28c40 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
28c50 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
28c60 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
28c70 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
28c80 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
28c90 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
28ca0 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
28cb0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
28cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
28cd0 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
28ce0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
28cf0 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
28d00 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
28d10 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
28d20 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
28d30 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
28d40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28d50 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
28d60 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
28d70 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
28d80 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
28d90 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
28da0 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
28db0 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
28dc0 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
28dd0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
28de0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
28df0 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
28e00 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
28e10 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
28e20 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
28e30 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
28e40 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
28e50 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
28e60 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
28e70 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
28e80 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
28e90 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
28ea0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
28eb0 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
28ec0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
28ed0 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
28ee0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
28ef0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
28f00 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
28f10 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
28f20 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
28f30 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
28f40 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
28f50 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
28f60 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
28f70 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
28f80 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
28f90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28fa0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
28fb0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
28fc0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
28fd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
28fe0 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
28ff0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29010 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
29020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29030 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
29040 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
29050 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
29060 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
29070 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
29080 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
29090 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
290a0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
290b0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
290c0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
290d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
290e0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
290f0 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
29100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29110 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
29120 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
29130 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
29140 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
29150 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
29160 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
29170 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
29180 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
29190 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
291a0 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RY ){.      cons
291b0 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
291c0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
291d0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
291e0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
291f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
29200 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
29210 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
29220 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
29230 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
29240 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
29250 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
29260 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
29270 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
29280 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
29290 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
292a0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
292b0 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
292c0 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
292d0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
292e0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
292f0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
29300 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
29310 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
29320 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
29330 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
29340 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
29350 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
29360 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
29370 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
29380 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
29390 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
293a0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
293b0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
293c0 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
293d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
293e0 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
293f0 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
29400 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
29410 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
29420 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
29430 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
29440 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
29450 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
29460 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
29470 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
29480 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
29490 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
294a0 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
294b0 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
294c0 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
294d0 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
294e0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
294f0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
29500 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
29510 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
29520 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
29530 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
29540 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
29550 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
29560 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
29570 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
29580 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
29590 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
295a0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
295b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
295c0 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
295d0 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
295e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
295f0 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
29600 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
29610 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
29620 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
29630 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
29640 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
29650 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
29660 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
29670 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
29680 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
29690 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
296a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
296b0 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
296c0 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
296d0 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
296e0 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
296f0 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
29700 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
29710 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
29720 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
29730 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
29740 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
29750 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
29760 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
29770 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
29780 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
29790 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
297a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
297b0 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
297c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
297d0 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
297e0 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
297f0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
29800 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
29810 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
29820 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
29830 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
29840 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
29850 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
29860 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
29870 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
29880 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
29890 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
298a0 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
298b0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
298c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
298d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
298e0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
298f0 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
29900 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
29910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29920 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
29930 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
29940 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
29950 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
29960 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
29970 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29980 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
29990 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
299a0 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
299b0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
299c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
299d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
299e0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
299f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
29a00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
29a10 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
29a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
29a30 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
29a40 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
29a50 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
29a60 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
29a70 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
29a80 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
29a90 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
29aa0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
29ab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
29ac0 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
29ad0 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
29ae0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
29af0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
29b00 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
29b10 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
29b20 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
29b30 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
29b40 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
29b50 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
29b60 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
29b70 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
29b80 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
29b90 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
29ba0 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
29bb0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
29bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
29bd0 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
29be0 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
29bf0 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
29c00 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
29c10 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
29c20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
29c30 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
29c40 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
29c50 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
29c60 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
29c70 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
29c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29c90 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
29ca0 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
29cb0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
29cc0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
29cd0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
29ce0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
29cf0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
29d00 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
29d10 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29d20 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
29d30 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
29d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
29d50 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
29d60 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
29d70 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
29d80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29d90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29db0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
29dc0 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
29dd0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
29de0 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
29df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
29e00 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
29e10 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
29e20 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
29e30 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
29e40 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
29e50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
29e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29e70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29e80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29e90 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
29ea0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
29eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
29ec0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
29ed0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
29ee0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
29ef0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
29f00 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
29f10 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
29f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29f30 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
29f40 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
29f50 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
29f60 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c   (pPager->syncFl
29f70 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
29f80 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
29f90 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
29fa0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29fb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29fc0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29fd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
29fe0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29ff0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
2a000 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
2a010 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
2a020 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
2a030 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
2a040 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2a050 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
2a060 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
2a070 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
2a080 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2a090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a0a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2a0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a0c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a0d0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
2a0e0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
2a0f0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
2a100 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2a110 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
2a120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
2a130 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
2a140 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
2a150 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
2a160 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
2a170 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
2a180 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
2a190 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
2a1a0 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
2a1b0 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
2a1c0 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
2a1d0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2a1e0 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
2a1f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2a200 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2a210 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
2a220 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a230 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
2a240 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
2a250 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
2a260 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
2a270 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
2a280 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
2a290 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
2a2a0 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
2a2b0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
2a2c0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
2a2d0 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
2a2e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a2f0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
2a300 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
2a310 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
2a320 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
2a330 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
2a340 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
2a350 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
2a360 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
2a370 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
2a380 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
2a390 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
2a3a0 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
2a3b0 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
2a3c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a3d0 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
2a3e0 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
2a3f0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
2a400 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
2a410 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
2a420 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
2a430 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
2a440 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
2a450 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
2a460 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
2a470 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2a480 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
2a490 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
2a4a0 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
2a4b0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
2a4c0 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
2a4d0 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
2a4e0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
2a4f0 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
2a500 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
2a510 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
2a520 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
2a530 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
2a540 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
2a550 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
2a560 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
2a570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a580 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
2a590 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
2a5a0 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
2a5b0 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
2a5c0 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
2a5d0 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
2a5e0 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
2a5f0 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
2a600 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
2a610 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
2a620 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
2a630 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
2a640 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
2a650 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
2a660 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
2a670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a680 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
2a690 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
2a6a0 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
2a6b0 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
2a6c0 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
2a6d0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
2a6e0 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
2a6f0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
2a700 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
2a710 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
2a720 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
2a730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
2a750 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2a760 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2a770 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2a780 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
2a790 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
2a7a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a7b0 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
2a7c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
2a7d0 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
2a7e0 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
2a7f0 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
2a800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2a810 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2a820 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
2a830 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
2a840 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a850 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2a860 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a870 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
2a880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a890 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
2a8a0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
2a8b0 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
2a8c0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
2a8d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
2a8e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2a8f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
2a900 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61 67 65 72  mpFile || pPager
2a910 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2a920 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
2a930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a940 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
2a950 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  VE_LOCK );.  ass
2a960 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a970 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74  er->fd) || pList
2a980 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  ->pDirty==0 );..
2a990 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2a9a0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
2a9b0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
2a9c0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
2a9d0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
2a9e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
2a9f0 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
2aa00 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
2aa10 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
2aa20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
2aa30 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2aa40 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
2aa50 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
2aa60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
2aa70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2aa80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2aa90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2aaa0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2aab0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
2aac0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
2aad0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
2aae0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
2aaf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
2ab00 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
2ab10 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
2ab20 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
2ab30 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
2ab40 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
2ab50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2ab60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2ab70 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
2ab80 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
2ab90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
2aba0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  && pPager->dbHin
2abb0 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  tSize<pPager->db
2abc0 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73  Size.   && (pLis
2abd0 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69  t->pDirty || pLi
2abe0 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  st->pgno>pPager-
2abf0 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29  >dbHintSize).  )
2ac00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
2ac10 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
2ac20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
2ac30 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
2ac40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2ac50 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
2ac60 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
2ac70 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
2ac80 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
2ac90 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
2aca0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2acb0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2acc0 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
2acd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ace0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
2acf0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
2ad00 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
2ad10 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
2ad20 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
2ad30 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
2ad40 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
2ad50 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
2ad60 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
2ad70 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
2ad80 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
2ad90 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
2ada0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
2adb0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
2adc0 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
2add0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
2ade0 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
2adf0 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
2ae00 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
2ae10 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2ae20 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
2ae30 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
2ae40 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
2ae50 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
2ae60 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
2ae70 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
2ae80 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
2ae90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2aea0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2aeb0 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
2aec0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
2aed0 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
2aee0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2aef0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
2af00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
2af10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2af20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
2af30 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af60 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
2af70 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
2af80 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
2af90 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2afa0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2afb0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
2afc0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
2afd0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2afe0 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
2aff0 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
2b000 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
2b010 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
2b020 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
2b030 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
2b040 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
2b050 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
2b060 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
2b070 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
2b080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b090 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
2b0a0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
2b0b0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2b0c0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
2b0d0 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
2b0e0 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
2b0f0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
2b100 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
2b110 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
2b120 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
2b130 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2b140 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
2b150 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
2b160 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
2b170 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
2b180 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
2b190 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
2b1a0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
2b1b0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
2b1c0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
2b1d0 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
2b1e0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2b1f0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
2b200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b210 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
2b220 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
2b230 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
2b240 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
2b250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2b260 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
2b270 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a  _STAT_WRITE]++;.
2b280 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2b290 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
2b2a0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
2b2b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
2b2c0 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
2b2d0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
2b2e0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
2b2f0 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
2b300 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
2b310 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2b320 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
2b330 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
2b340 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2b350 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2b360 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
2b370 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
2b380 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
2b390 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
2b3a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
2b3b0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
2b3c0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
2b3d0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
2b3e0 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  unt);.    }else{
2b3f0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2b400 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
2b410 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2b420 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2b430 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
2b440 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
2b450 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
2b460 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
2b470 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
2b480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2b490 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
2b4a0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2b4b0 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
2b4c0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
2b4d0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
2b4e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2b4f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2b500 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
2b510 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
2b520 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
2b530 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
2b540 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
2b550 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2b560 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
2b570 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
2b580 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2b590 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
2b5a0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2b5b0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2b5c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2b5d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2b5e0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e  sjfd) ){.    con
2b5f0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
2b600 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
2b610 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f  OURNAL | SQLITE_
2b620 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 0a  OPEN_READWRITE .
2b630 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2b640 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
2b650 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2b660 56 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  VE .      | SQLI
2b670 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2b680 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e  CLOSE;.    int n
2b690 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69  StmtSpill = sqli
2b6a0 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53  te3Config.nStmtS
2b6b0 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 50  pill;.    if( pP
2b6c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2b6d0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2b6e0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
2b6f0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2b700 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 6e 53 74  ory ){.      nSt
2b710 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20  mtSpill = -1;.  
2b720 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2b730 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
2b740 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
2b750 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66   pPager->sjfd, f
2b760 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c  lags, nStmtSpill
2b770 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b780 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
2b790 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
2b7a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
2b7b0 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
2b7c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b7d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2b7e0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
2b7f0 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
2b800 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
2b810 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
2b820 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
2b830 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
2b840 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2b850 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
2b860 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2b870 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
2b880 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
2b890 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
2b8a0 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
2b8b0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
2b8c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
2b8d0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
2b8e0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
2b8f0 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
2b900 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
2b910 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
2b920 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
2b930 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2b940 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
2b950 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b960 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
2b970 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2b980 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
2b990 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2b9a0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2b9b0 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
2b9c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2b9d0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
2b9e0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
2b9f0 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
2ba00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ba10 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2ba20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2ba30 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2ba40 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
2ba50 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
2ba60 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2ba70 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
2ba80 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
2ba90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2baa0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2bab0 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
2bac0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
2bad0 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20  Pager, pPg) .   
2bae0 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
2baf0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
2bb00 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
2bb10 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2bb20 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
2bb30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
2bb40 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
2bb50 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
2bb60 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
2bb70 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
2bb80 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
2bb90 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
2bba0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
2bbb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bbc0 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
2bbd0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
2bbe0 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
2bbf0 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61  ffset = (i64)pPa
2bc00 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
2bc10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2bc20 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
2bc30 44 61 74 61 32 3b 0a 0a 23 69 66 20 53 51 4c 49  Data2;..#if SQLI
2bc40 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 20 20 0a  TE_HAS_CODEC   .
2bc50 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2bc60 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
2bc70 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  ){.        CODEC
2bc80 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2bc90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2bca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2bcb0 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29  EM_BKPT, pData2)
2bcc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2bcd0 6e 64 69 66 0a 20 20 20 20 20 20 70 44 61 74 61  ndif.      pData
2bce0 32 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20  2 = pData;.     
2bcf0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2bd00 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2bd10 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2bd20 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2bd30 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2bd40 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2bd50 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2bd60 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2bd70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2bd80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bd90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bda0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2bdb0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2bdc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2bdd0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2bde0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2bdf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2be00 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2be10 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2be20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2be30 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2be40 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2be50 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2be60 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2be70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2be80 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2be90 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2bea0 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2beb0 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2bec0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2bed0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2bee0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2bef0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2bf00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bf10 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2bf20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bf30 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2bf40 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2bf50 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2bf60 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2bf70 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2bf80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2bf90 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2bfa0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2bfb0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2bfc0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2bfd0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2bfe0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2bff0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2c000 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2c010 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2c020 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2c030 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2c040 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2c050 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2c060 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2c070 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2c080 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2c090 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2c0a0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2c0b0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2c0c0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2c0d0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2c0e0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2c0f0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2c100 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2c110 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2c120 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c130 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2c140 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2c150 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2c160 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2c170 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2c180 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2c190 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2c1a0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2c1b0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2c1c0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2c1d0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2c1e0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2c1f0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2c200 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2c210 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2c220 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2c230 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2c240 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2c250 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2c260 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2c270 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2c280 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2c290 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2c2a0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2c2b0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2c2c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c2d0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2c2e0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2c2f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2c300 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2c310 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c320 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2c330 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2c340 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2c350 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2c360 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2c370 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2c380 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2c390 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2c3a0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2c3b0 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2c3c0 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2c3d0 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2c3e0 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2c3f0 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2c400 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2c410 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c420 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2c430 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2c440 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2c450 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2c460 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2c470 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2c480 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2c490 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2c4a0 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2c4b0 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2c4c0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2c4d0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2c4e0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2c4f0 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2c500 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2c510 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2c520 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2c530 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2c540 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2c550 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2c560 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2c570 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2c580 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2c590 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2c5a0 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2c5b0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2c5c0 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2c5d0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2c5e0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2c5f0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2c600 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2c610 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2c620 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2c630 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2c640 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2c650 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2c660 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2c670 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2c680 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2c690 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2c6a0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2c6b0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2c6c0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2c6d0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2c6e0 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2c6f0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2c700 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2c710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c720 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2c730 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c740 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2c750 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2c760 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2c770 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2c780 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2c790 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2c7a0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2c7b0 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2c7c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2c7d0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2c7e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c7f0 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2c800 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2c810 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2c820 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2c830 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2c840 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2c850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c860 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2c870 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2c880 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2c890 65 72 29 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  er) ){.#ifndef S
2c8a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
2c8b0 52 52 45 4e 54 0a 20 20 20 20 2f 2a 20 49 66 20  RRENT.    /* If 
2c8c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2c8d0 69 73 20 61 20 22 42 45 47 49 4e 20 43 4f 4e 43  is a "BEGIN CONC
2c8e0 55 52 52 45 4e 54 22 20 74 72 61 6e 73 61 63 74  URRENT" transact
2c8f0 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 20 0a 20  ion, the page . 
2c900 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20     ** cannot be 
2c910 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
2c920 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 6e   Return early in
2c930 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
2c940 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
2c950 41 6c 6c 52 65 61 64 20 29 20 72 65 74 75 72 6e  AllRead ) return
2c960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
2c970 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
2c980 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2c990 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2c9a0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2c9b0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2c9c0 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
2c9d0 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63  Pg); .    if( rc
2c9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c9f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2ca00 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2ca10 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2ca20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
2ca30 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2ca40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2ca50 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2ca60 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2ca70 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2ca80 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2ca90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2caa0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2cab0 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2cac0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2cad0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2cae0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2caf0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2cb00 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2cb10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cb20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2cb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cb40 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2cb50 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2cb60 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2cb70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2cb80 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2cb90 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2cba0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2cbb0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2cbc0 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2cbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cbe0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2cbf0 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2cc00 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2cc10 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2cc20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2cc30 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2cc40 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2cc50 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2cc60 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2cc70 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2cc80 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2cc90 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2cca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2ccb0 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2ccc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2ccd0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2cce0 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Code;.  if( !MEM
2ccf0 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
2cd00 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
2cd10 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2cd20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2cd30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
2cd40 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2cd50 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2cd60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2cd70 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2cd80 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e  .      PgHdr *pN
2cd90 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
2cda0 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rty;.      if( p
2cdb0 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  List->nRef==0 ){
2cdc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2cdd0 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a  gerStress((void*
2cde0 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b  )pPager, pList);
2cdf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2ce00 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
2ce10 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2ce20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2ce30 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2ce40 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2ce50 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2ce60 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2ce70 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2ce80 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2ce90 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2cea0 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2ceb0 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2cec0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2ced0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2cee0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2cef0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2cf00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2cf10 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2cf20 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2cf30 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2cf40 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2cf50 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2cf60 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2cf70 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2cf80 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2cf90 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2cfa0 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2cfb0 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2cfc0 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2cfd0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2cfe0 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2cff0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2d000 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2d010 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2d020 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2d030 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2d040 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2d050 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2d060 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2d070 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2d080 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2d090 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2d0a0 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2d0b0 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2d0c0 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2d0d0 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2d0e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2d0f0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2d100 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2d110 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2d120 20 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61 67    When a new pag
2d130 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
2d140 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20 62  the.** first 8 b
2d150 79 74 65 73 20 6f 66 20 74 68 69 73 20 73 70 61  ytes of this spa
2d160 63 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62 75  ce are zeroed bu
2d170 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
2d180 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
2d190 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61 20  ..** (The extra 
2d1a0 73 70 61 63 65 20 69 73 20 75 73 65 64 20 62 79  space is used by
2d1b0 20 62 74 72 65 65 20 61 73 20 74 68 65 20 4d 65   btree as the Me
2d1c0 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a  mPage object.).*
2d1d0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2d1e0 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2d1f0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2d200 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2d210 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2d220 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2d230 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2d240 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2d250 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2d260 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2d270 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2d280 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2d290 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2d2a0 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2d2b0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2d2c0 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2d2d0 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2d2e0 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2d2f0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2d300 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2d310 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2d320 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2d330 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2d340 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2d350 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2d360 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2d370 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2d380 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2d390 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2d3a0 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2d3b0 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2d3c0 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2d3d0 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2d3e0 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2d3f0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2d400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d410 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2d420 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2d430 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2d440 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2d450 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2d460 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2d470 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2d480 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2d490 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2d4a0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2d4b0 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2d4c0 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2d4d0 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2d4e0 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2d4f0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2d500 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2d510 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2d520 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2d530 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2d540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d550 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2d560 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2d570 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2d580 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2d590 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2d5a0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2d5b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d5c0 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2d5d0 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2d5e0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2d5f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2d600 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2d610 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2d620 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2d630 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2d640 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2d650 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2d660 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2d670 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2d680 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2d690 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2d6a0 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2d6b0 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2d6c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d6d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2d6e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2d6f0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2d700 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2d710 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2d720 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2d730 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2d740 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2d750 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d760 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2d770 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2d780 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2d790 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2d7a0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2d7b0 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2d7c0 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2d7d0 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2d7e0 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2d7f0 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2d800 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2d810 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2d820 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2d830 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2d840 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2d850 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2d860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2d870 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2d880 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2d890 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2d8a0 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2d8b0 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2d8c0 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2d8d0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2d8e0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2d8f0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2d900 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2d910 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2d920 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2d930 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2d940 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d950 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2d960 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2d970 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2d980 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2d990 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2d9a0 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2d9b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d9c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2d9d0 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2d9e0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2d9f0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2da00 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2da10 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2da20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2da30 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2da40 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2da50 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2da60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2da70 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c   */.  journalFil
2da80 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2da90 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2daa0 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20  e(pVfs));..  /* 
2dab0 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2dac0 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2dad0 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2dae0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2daf0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2db00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2db10 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2db20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2db30 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2db40 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2db50 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2db60 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2db70 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2db80 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2db90 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2dba0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2dbb0 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2dbc0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2dbd0 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2dbe0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2dbf0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2dc00 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2dc10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2dc20 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2dc30 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2dc40 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2dc50 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2dc60 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2dc70 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2dc80 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2dc90 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2dca0 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2dcb0 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2dcc0 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2dcd0 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2dce0 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2dcf0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2dd00 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2dd10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2dd20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2dd30 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2dd40 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2dd50 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2dd60 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2dd70 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2dd80 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2dd90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2dda0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2ddb0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  PT;.    }.    zP
2ddc0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2ddd0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2dde0 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2ddf0 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2de00 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2de10 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2de20 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2de30 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2de40 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2de50 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2de60 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2de70 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2de80 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2de90 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2dea0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2deb0 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2dec0 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2ded0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2dee0 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2def0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2df00 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2df10 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2df20 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2df30 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2df40 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2df50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2df60 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2df70 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2df80 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2df90 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2dfa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2dfb0 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2dfc0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2dfd0 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2dfe0 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2dff0 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2e000 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2e010 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2e020 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2e030 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2e040 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2e050 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2e060 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2e070 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2e080 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2e090 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2e0a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2e0b0 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2e0c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2e0d0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2e0e0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2e0f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2e110 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2e120 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2e130 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2e140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2e150 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2e160 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2e170 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2e180 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2e190 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2e1a0 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2e1b0 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2e1c0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2e1d0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2e1e0 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2e1f0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2e200 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2e210 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2e230 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2e240 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2e250 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2e270 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2e280 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2e290 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2e2a0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2e2b0 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2e2c0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2e2d0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2e2e0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2e2f0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2e300 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2e310 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2e320 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2e330 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2e340 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2e350 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2e360 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2e370 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2e380 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e390 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2e3a0 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2e3b0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2e3c0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2e3d0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2e3e0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2e3f0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2e400 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2e410 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2e420 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2e430 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2e440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2e450 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2e460 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2e470 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2e480 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2e490 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2e4a0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2e4b0 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2e4c0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2e4d0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2e4e0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2e4f0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2e500 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2e510 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e530 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2e540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e550 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2e560 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2e570 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2e580 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2e590 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2e5a0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2e5b0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2e5c0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2e5d0 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2e5e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2e5f0 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2e600 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2e610 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2e620 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  T;.  }.  pPager 
2e630 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2e640 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2e650 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e660 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2e670 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2e680 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2e690 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2e6a0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2e6b0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2e6c0 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2e6d0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2e6e0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2e6f0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2e700 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2e710 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2e720 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2e730 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2e740 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2e750 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e760 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2e770 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2e780 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2e790 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2e7a0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2e7b0 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2e7c0 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2e7d0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2e7e0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2e7f0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2e800 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2e810 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2e820 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2e830 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2e840 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2e850 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2e860 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2e870 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2e880 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2e890 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2e8a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2e8b0 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2e8c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e8d0 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2e8e0 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2e8f0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2e900 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2e910 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2e920 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2e930 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2e940 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2e950 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2e960 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2e970 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2e980 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2e990 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2e9a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e9b0 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2e9c0 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2e9d0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2e9e0 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2e9f0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2ea00 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2ea10 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2ea20 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2ea30 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2ea40 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2ea50 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2ea60 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2ea70 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2ea80 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2ea90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2eaa0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2eab0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2eac0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2ead0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2eae0 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2eaf0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2eb00 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2eb10 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2eb20 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2eb30 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb50 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2eb60 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2eb70 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2eb80 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2eb90 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2eba0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2ebb0 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2ebc0 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2ebd0 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2ebe0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2ebf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2ec00 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2ec10 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2ec20 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2ec30 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2ec40 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2ec50 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2ec60 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2ec70 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2ec80 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2ec90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2eca0 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2ecb0 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2ecc0 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2ecd0 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2ece0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2ecf0 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2ed00 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2ed10 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2ed20 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2ed30 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2ed40 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2ed50 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2ed60 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2ed70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2ed80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ed90 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2eda0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2edb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2edc0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2edd0 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2ede0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2edf0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2ee00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ee10 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2ee20 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2ee30 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2ee40 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2ee50 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2ee60 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2ee70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2ee80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2ee90 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2eea0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2eeb0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2eec0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2eed0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2eee0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2eef0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2ef10 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2ef20 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2ef30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ef40 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2ef50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2ef60 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2ef70 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2ef80 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2ef90 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2efa0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2efb0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2efc0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2efd0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2efe0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2eff0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f000 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2f010 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2f020 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2f030 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2f040 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2f050 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f060 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2f070 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f080 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2f090 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2f0a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2f0b0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f0c0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2f0d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2f0e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2f0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2f100 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2f110 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2f120 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2f130 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2f140 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2f150 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2f160 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2f170 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2f180 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2f190 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2f1a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2f1b0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2f1c0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2f1d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2f1e0 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2f1f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f210 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2f220 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2f230 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2f240 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2f250 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2f260 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2f270 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2f280 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2f290 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2f2a0 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2f2b0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2f2c0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2f2d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2f2e0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2f2f0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2f300 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2f310 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2f320 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2f330 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2f340 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2f350 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2f360 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2f370 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2f380 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2f390 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2f3a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2f3b0 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2f3c0 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2f3d0 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2f3e0 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2f3f0 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2f400 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2f410 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2f420 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2f430 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2f440 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2f450 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2f460 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2f470 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2f480 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2f490 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d  e in EXCLUSIVE m
2f4a0 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ode */.    pPage
2f4b0 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20  r->noLock = 1;  
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f4d0 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a   Do no locking *
2f4e0 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  /.    readOnly =
2f4f0 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2f500 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2f510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2f520 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2f530 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2f540 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2f550 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2f560 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2f570 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2f580 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2f590 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2f5a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2f5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f5c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f5d0 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2f5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f5f0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2f600 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2f610 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2f620 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2f630 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2f640 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2f650 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2f660 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78  TE_OK ){.    nEx
2f680 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2f690 74 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74  tra);.    assert
2f6a0 28 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e  ( nExtra>=8 && n
2f6b0 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2f6c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
2f6d0 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
2f6e0 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
2f6f0 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
2f700 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2f710 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2f720 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2f730 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2f740 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2f750 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2f760 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ed above, free t
2f770 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74  he  Pager struct
2f780 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2f790 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2f7a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f7b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
2f7c0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2f7d0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  d);.    sqlite3P
2f7e0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
2f7f0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
2f800 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2f810 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2f820 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
2f830 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2f840 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2f850 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2f860 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2f870 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2f880 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2f890 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2f8a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2f8b0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2f8c0 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2f8d0 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2f8e0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2f8f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f900 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2f910 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f920 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2f930 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2f940 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2f950 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2f960 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2f970 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2f980 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2f990 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2f9a0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2f9b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2f9c0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2f9d0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f9e0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2f9f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2fa00 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2fa10 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2fa20 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2fa30 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2fa40 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2fa50 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2fa60 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2fa70 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2fa80 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2fa90 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2faa0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2fab0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2fac0 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2fad0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2fae0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2faf0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2fb00 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2fb10 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2fb20 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2fb30 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2fb40 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2fb50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2fb60 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2fb70 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2fb80 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
2fb90 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2fba0 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
2fbb0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2fbc0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2fbd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72  rt( pPager->extr
2fbe0 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  aSync==0 );.    
2fbf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fc00 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2fc10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fc20 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2fc30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2fc40 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  t( pPager->ckptS
2fc50 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2fc60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2fc70 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
2fc80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
2fc90 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  traSync = 0;.   
2fca0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2fcb0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2fcc0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
2fcd0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2fce0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2fcf0 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e  NORMAL | WAL_SYN
2fd00 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
2fd10 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
2fd20 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2fd30 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2fd40 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2fd50 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
2fd60 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2fd70 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
2fd80 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2fd90 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
2fda0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
2fdb0 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
2fdc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
2fdd0 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
2fde0 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
2fdf0 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
2fe00 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2fe10 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
2fe20 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
2fe30 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2fe40 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
2fe50 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
2fe60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2fe70 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2fe80 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
2fe90 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
2fea0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2feb0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2fec0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
2fed0 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2fee0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
2fef0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ff00 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
2ff10 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
2ff20 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
2ff30 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74  = xReinit;.  set
2ff40 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
2ff50 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  ger);.  /* memse
2ff60 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
2ff70 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
2ff80 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
2ff90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d   /* pPager->szMm
2ffa0 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
2ffb0 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f  ULT_MMAP_SIZE //
2ffc0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20   will be set by 
2ffd0 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70  btree.c */..  *p
2ffe0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
2fff0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30000 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69  _OK;.}.../* Veri
30010 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
30020 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
30030 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  t be deleted or 
30040 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d  renamed out from
30050 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61  .** under the pa
30060 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ger.  Return SQL
30070 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61  ITE_OK if the da
30080 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20  tabase is still 
30090 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a  were it ought.**
300a0 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20   to be on disk. 
300b0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
300c0 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   (SQLITE_READONL
300d0 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d  Y_DBMOVED or som
300e0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  e other error.**
300f0 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
30100 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66  e3OsAccess()) if
30110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
30120 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a  s gone missing..
30130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
30140 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
30150 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30160 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20    int bHasMoved 
30170 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
30180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
30190 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  mpFile ) return 
301a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
301b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
301c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
301d0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
301e0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
301f0 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46  me && pPager->zF
30200 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  ilename[0] );.  
30210 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
30220 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
30230 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
30240 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62  TL_HAS_MOVED, &b
30250 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28  HasMoved);.  if(
30260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
30270 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OUND ){.    /* I
30280 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20  f the HAS_MOVED 
30290 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20  file-control is 
302a0 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61  unimplemented, a
302b0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
302c0 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ile.    ** has n
302d0 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20  ot been moved.  
302e0 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74  That is the hist
302f0 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20  orical behavior 
30300 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72  of SQLite: prior
30310 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   to.    ** versi
30320 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76  on 3.8.3, it nev
30330 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  er checked */.  
30340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30350 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
30360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
30370 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  HasMoved ){.    
30380 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
30390 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20  ONLY_DBMOVED;.  
303a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
303b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
303c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
303d0 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
303e0 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
303f0 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
30400 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
30410 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
30420 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
30430 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
30440 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
30450 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
30460 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
30470 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
30480 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
30490 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
304a0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
304b0 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
304c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
304d0 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
304e0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
304f0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
30500 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
30510 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
30520 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
30530 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
30540 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
30550 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
30560 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30570 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
30580 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
30590 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
305a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
305b0 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
305c0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
305d0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
305e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
305f0 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
30600 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
30610 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
30620 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30630 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
30640 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
30650 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
30660 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
30670 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
30680 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
30690 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
306a0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
306b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
306c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
306d0 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
306e0 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
306f0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
30700 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
30710 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
30720 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
30730 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
30740 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
30750 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
30760 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
30770 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
30780 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
30790 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
307a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
307b0 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
307c0 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
307d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
307e0 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
307f0 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
30800 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30810 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
30820 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
30830 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
30840 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
30850 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
30860 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30870 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
30880 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
30890 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
308a0 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
308b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
308c0 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
308d0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
308e0 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
308f0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
30900 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
30910 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
30920 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
30930 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
30940 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
30950 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30960 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
30970 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
30980 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
30990 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
309a0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
309b0 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
309c0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
309d0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
309e0 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
309f0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
30a00 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
30a10 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
30a20 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
30a30 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
30a40 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
30a50 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
30a60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30a70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
30a80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
30a90 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ab0 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
30ac0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
30ad0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
30ae0 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
30af0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
30b00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30b10 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
30b20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
30b30 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
30b40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30b50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30b60 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
30b70 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
30b80 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
30b90 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
30ba0 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
30bb0 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
30bc0 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
30bd0 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
30be0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
30bf0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30c00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
30c10 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
30c20 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
30c30 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
30c40 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
30c50 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
30c60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
30c70 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
30c80 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
30c90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30ca0 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
30cb0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
30cc0 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
30cd0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
30ce0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
30cf0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
30d00 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
30d10 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
30d20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
30d30 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
30d40 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
30d50 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
30d60 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
30d70 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
30d80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
30d90 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
30da0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
30db0 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
30dc0 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
30dd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
30de0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
30df0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
30e00 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
30e10 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
30e20 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
30e30 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
30e40 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
30e50 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
30e60 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
30e70 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
30e80 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
30e90 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
30ea0 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
30eb0 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
30ec0 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
30ed0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
30ee0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
30ef0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
30f00 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
30f10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
30f20 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
30f30 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
30f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30f50 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
30f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30f70 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
30f80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30f90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
30fa0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
30fb0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
30fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
30fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30fe0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
30ff0 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
31000 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
31010 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
31020 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
31030 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
31040 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
31050 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
31060 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
31070 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
31080 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
31090 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
310a0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
310b0 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
310c0 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
310d0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
310e0 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
310f0 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
31100 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
31110 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
31120 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
31130 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
31140 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
31150 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
31160 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
31170 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
31180 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
31190 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
311a0 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
311b0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
311c0 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
311d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
311e0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
311f0 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
31200 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
31210 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
31220 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
31230 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
31240 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
31250 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
31260 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31270 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
31280 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
31290 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
312a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
312b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
312c0 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
312d0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
312e0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
312f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31300 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
31310 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31330 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
31340 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
31350 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
31360 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
31370 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
31380 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
31390 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
313a0 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
313b0 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
313c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
313d0 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
313e0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
313f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
31400 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
31410 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
31420 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
31430 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
31440 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
31450 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
31460 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
31470 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
31480 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
31490 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
314a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
314b0 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
314c0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
314d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
314e0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
314f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31500 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31510 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31520 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
31530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31560 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
31570 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
31580 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
31590 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
315a0 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
315b0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
315c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
315d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
315e0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
315f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31600 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
31610 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
31620 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31640 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31650 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31670 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
31680 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
31690 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
316a0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
316b0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
316c0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
316d0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
316e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
316f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
31700 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
31710 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
31720 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
31730 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
31740 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
31750 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
31760 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31770 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
31780 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
31790 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
317a0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
317b0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
317c0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
317d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
317e0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
317f0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
31800 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
31810 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
31820 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
31830 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
31840 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
31850 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
31860 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
31870 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
31880 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
31890 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
318a0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
318b0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
318c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
318d0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
318e0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
318f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
31900 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
31910 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
31920 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31930 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31940 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31960 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31970 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
31980 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
31990 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
319a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
319b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
319c0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
319d0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
319e0 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
319f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
31a00 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
31a10 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
31a20 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
31a30 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
31a40 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
31a50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31a60 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
31a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
31a80 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
31a90 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
31aa0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
31ab0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
31ac0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31ad0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
31ae0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
31af0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
31b00 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
31b10 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
31b20 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
31b30 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
31b40 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
31b50 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31b60 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
31b70 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
31b80 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
31b90 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
31ba0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
31bb0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
31bc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
31bd0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
31be0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
31bf0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
31c00 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
31c10 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
31c20 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
31c30 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
31c40 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
31c50 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
31c60 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
31c70 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
31c80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
31c90 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
31ca0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
31cb0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
31cc0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
31cd0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
31ce0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
31cf0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
31d00 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
31d10 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
31d20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
31d30 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
31d40 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
31d50 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
31d60 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
31d70 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
31d80 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
31d90 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
31da0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
31db0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
31dc0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
31dd0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
31de0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
31df0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
31e00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
31e10 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
31e20 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
31e30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
31e40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
31e50 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
31e60 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
31e70 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
31e80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
31e90 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
31ea0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
31eb0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
31ec0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31ed0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
31ee0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
31ef0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
31f00 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
31f10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
31f30 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
31f40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
31f50 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
31f60 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
31f70 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
31f80 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
31f90 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
31fa0 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
31fb0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
31fc0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
31fd0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
31fe0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
31ff0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
32000 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
32010 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
32020 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
32030 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
32040 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
32050 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32060 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
32070 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32080 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
32090 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
320a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
320b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
320c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
320d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
320e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
320f0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
32100 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  _OK );..  if( !p
32110 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32120 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
32130 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32140 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
32150 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
32160 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32170 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
32180 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
32190 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
321a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
321b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
321c0 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
321d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
321e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
321f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
32200 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
32210 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
32220 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32250 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
32260 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32270 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
32280 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
32290 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
322a0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
322b0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
322c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
322d0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
322e0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
322f0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
32300 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
32310 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
32320 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
32330 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32340 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32350 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32360 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
32370 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
32380 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
32390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
323a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
323b0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
323c0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
323d0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
323e0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
323f0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
32400 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
32410 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
32420 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32430 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32440 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32450 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32460 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
32470 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32480 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
32490 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
324a0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
324b0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
324c0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
324d0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
324e0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
324f0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
32500 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
32510 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32520 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
32530 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32540 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32550 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32560 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
32570 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
32580 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
32590 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
325a0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
325b0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
325c0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
325d0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
325e0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
325f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32600 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
32610 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
32620 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
32630 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32640 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32650 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32660 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
32670 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
32680 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
32690 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
326a0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
326b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
326c0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
326d0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
326e0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
326f0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32700 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32710 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32720 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32730 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32750 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32760 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32770 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
32780 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32790 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
327a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
327b0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
327c0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
327d0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
327e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
327f0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32800 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32810 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
32820 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
32830 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
32840 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
32850 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
32860 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
32870 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
32880 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
32890 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
328a0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
328b0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
328c0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
328d0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
328e0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
328f0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
32900 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
32910 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32920 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
32930 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
32940 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
32950 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
32960 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
32970 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
32980 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
32990 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
329a0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
329b0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
329c0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
329d0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
329e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
329f0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
32a00 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
32a10 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
32a20 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
32a30 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
32a40 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
32a50 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
32a60 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
32a70 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
32a80 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
32a90 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
32aa0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
32ab0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
32ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
32ad0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
32ae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32af0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32b00 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32b10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
32b20 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
32b30 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
32b40 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
32b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32b60 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
32b70 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
32b80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32b90 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
32ba0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
32bb0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
32bc0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32bd0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
32be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
32c00 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
32c10 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
32c20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32c30 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
32c40 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
32c50 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
32c60 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
32c70 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
32c80 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
32c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32ca0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
32cb0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
32cc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
32cd0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
32ce0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
32cf0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
32d00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
32d10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
32d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
32d30 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
32d40 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
32d50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32d60 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
32d70 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
32d80 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
32d90 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
32da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32db0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
32dc0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
32dd0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
32de0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
32df0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
32e00 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
32e10 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
32e20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
32e30 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
32e40 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
32e50 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
32e60 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
32e70 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
32e80 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
32e90 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
32ea0 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
32eb0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
32ec0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
32ed0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
32ee0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
32ef0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
32f00 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
32f10 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
32f20 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
32f30 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
32f40 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
32f50 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
32f60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
32f70 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
32f80 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
32f90 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
32fa0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
32fb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
32fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
32fe0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
32ff0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
33000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33020 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
33030 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50  back(pPager, !pP
33040 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
33050 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
33060 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
33070 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
33080 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
33090 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
330a0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
330b0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
330c0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
330d0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
330e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
330f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33100 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
33110 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
33120 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
33130 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
33140 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
33150 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
33160 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
33170 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
33180 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
33190 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
331a0 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
331b0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
331c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
331d0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
331e0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
331f0 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
33200 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
33210 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
33220 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
33230 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
33240 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
33250 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
33260 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
33270 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
33280 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
33290 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
332a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
332b0 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
332c0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
332d0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
332e0 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
332f0 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
33300 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
33310 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
33320 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
33330 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
33340 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
33350 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
33360 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
33370 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
33380 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
33390 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
333a0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
333b0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
333c0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
333d0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
333e0 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
333f0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
33400 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
33410 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
33420 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
33430 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
33440 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
33450 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
33460 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
33470 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
33480 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
33490 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
334a0 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
334b0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
334c0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
334d0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
334e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
334f0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
33500 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
33510 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33520 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33530 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
33540 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
33550 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
33560 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
33570 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
33580 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
33590 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
335a0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
335b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
335c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
335d0 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48   && pPager->hasH
335e0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b  eldSharedLock ){
335f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
33600 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
33610 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
33620 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20   then check to. 
33630 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
33640 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
33650 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
33660 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33670 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20  has changed,.   
33680 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
33690 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48  cache.  The hasH
336a0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c  eldSharedLock fl
336b0 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  ag prevents this
336c0 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f   from.      ** o
336d0 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20  ccurring on the 
336e0 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73  very first acces
336f0 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20  s to a file, in 
33700 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a  order to save a.
33710 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
33720 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69  unnecessary sqli
33730 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
33740 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70   at the start-up
33750 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33760 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
33770 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65  nges are detecte
33780 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
33790 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
337a0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
337b0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
337c0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
337d0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
337e0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
337f0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
33800 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
33810 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
33820 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
33830 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
33840 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
33850 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
33860 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
33870 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
33880 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
33890 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
338a0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
338b0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
338c0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
338d0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
338e0 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
338f0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
33900 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
33910 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
33920 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
33930 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
33940 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
33950 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
33960 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
33970 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
33980 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
33990 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
339a0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
339b0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
339c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
339d0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
339e0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
339f0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
33a00 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
33a10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
33a20 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33a30 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
33a40 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
33a50 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
33a60 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
33a70 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
33a80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
33aa0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
33ab0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
33ac0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
33ad0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
33ae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33af0 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
33b00 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
33b10 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
33b20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
33b30 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
33b40 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
33b50 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
33b60 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
33b70 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
33b80 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
33b90 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61  .        /* Unma
33ba0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  p the database f
33bb0 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69  ile. It is possi
33bc0 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61  ble that externa
33bd0 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20  l processes.    
33be0 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20      ** may have 
33bf0 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61  truncated the da
33c00 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
33c10 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74  then extended it
33c20 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a   back.        **
33c30 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
33c40 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73   size while this
33c50 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74   process was not
33c60 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e   holding a lock.
33c70 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
33c80 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d  his case there m
33c90 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72  ay exist a Pager
33ca0 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68  .pMap mapping th
33cb0 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20  at appears.     
33cc0 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20     ** to be the 
33cd0 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69  right size but i
33ce0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76  s not actually v
33cf0 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73  alid. Avoid this
33d00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
33d10 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70  ibility by unmap
33d20 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65  ping the db here
33d30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
33d40 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
33d50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
33d60 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
33d70 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
33d80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33d90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33da0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
33db0 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
33dc0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
33dd0 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
33de0 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
33df0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
33e00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
33e10 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
33e20 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
33e30 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
33e40 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
33e50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53  ager);.#ifndef S
33e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
33e70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33e80 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
33e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23  ==SQLITE_OK );.#
33ea0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
33eb0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33ec0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
33ed0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33ee0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
33ef0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
33f00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
33f10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
33f20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
33f30 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
33f40 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
33f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33f60 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
33f70 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
33f80 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
33f90 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
33fa0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
33fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
33fc0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
33fd0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
33fe0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
33ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34000 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
34010 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34020 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
34030 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
34040 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65     pPager->hasHe
34050 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31  ldSharedLock = 1
34060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
34070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
34080 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
34090 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
340a0 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
340b0 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
340c0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
340d0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
340e0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
340f0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
34100 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
34110 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
34120 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
34130 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
34140 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
34150 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
34160 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
34170 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
34180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
34190 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
341a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
341b0 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
341c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
341d0 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f  ( pPager->nMmapO
341e0 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65  ut==0 && (sqlite
341f0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
34200 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
34210 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
34220 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
34230 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
34240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
34250 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73  e getter methods
34260 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63 71   each try to acq
34270 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
34280 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69   to a.** page wi
34290 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  th page number p
342a0 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75  gno. If the requ
342b0 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
342c0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
342d0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
342e0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
342f0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
34300 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
34310 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64 69  .** There are di
34320 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  fferent implemen
34330 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67  tations of the g
34340 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70  etter method dep
34350 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ending.** on the
34360 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
34370 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  f the pager..**.
34380 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f  **     getPageNo
34390 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d  rmal()         -
343a0 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65  -  The normal ge
343b0 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50  tter.**     getP
343c0 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20 20  ageError()      
343d0 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20      --  Used if 
343e0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
343f0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  an error state.*
34400 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61  *     getPageMma
34410 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d  p()           --
34420 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79    Used if memory
34430 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65  -mapped I/O is e
34440 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20  nabled.**.** If 
34450 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
34460 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
34470 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
34480 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
34490 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
344a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
344b0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
344c0 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
344d0 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
344e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
344f0 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
34500 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
34510 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
34520 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
34530 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
34540 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
34550 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
34560 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
34570 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
34580 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
34590 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
345a0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
345b0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
345c0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
345d0 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
345e0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
345f0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
34600 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
34610 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
34620 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
34630 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
34640 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
34650 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
34660 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
34670 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
34680 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
34690 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
346a0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
346b0 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
346c0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
346d0 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
346e0 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70   .** the flags p
346f0 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e  arameter contain
34700 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  s the PAGER_GET_
34710 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e  NOCONTENT bit an
34720 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
34730 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
34740 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
34750 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
34760 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
34770 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
34780 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
34790 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
347a0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
347b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
347c0 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
347d0 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54  .** If PAGER_GET
347e0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72  _NOCONTENT is tr
347f0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
34800 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
34810 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
34820 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
34830 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
34840 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
34850 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
34860 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
34870 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
34880 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34890 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
348a0 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
348b0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
348c0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
348d0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
348e0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
348f0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
34900 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
34910 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
34920 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
34930 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
34940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52  ..**.** If PAGER
34950 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
34960 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
34970 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
34980 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
34990 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61  .** of being rea
349a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
349b0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
349c0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
349d0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
349e0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
349f0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
34a00 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
34a10 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
34a20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
34a30 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
34a40 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
34a50 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
34a60 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
34a70 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
34a80 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
34a90 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
34aa0 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
34ab0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
34ac0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
34ad0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
34ae0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
34af0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
34b00 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
34b10 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
34b20 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
34b30 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
34b40 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
34b50 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
34b60 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
34b70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
34b80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
34b90 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
34ba0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
34bb0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
34bc0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
34bd0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
34be0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
34bf0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
34c00 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
34c10 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
34c20 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
34c30 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
34c40 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
34c50 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
34c60 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
34c70 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
34c80 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
34c90 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
34ca0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
34cb0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
34cc0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
34cd0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
34ce0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
34cf0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
34d00 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
34d10 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
34d20 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
34d30 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
34d40 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
34d50 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
34d60 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
34d70 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74  nal files..*/.st
34d80 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
34d90 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20  Normal(.  Pager 
34da0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
34db0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
34dc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34dd0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
34de0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
34df0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
34e00 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
34e10 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
34e20 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
34e30 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
34e40 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
34e50 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
34e60 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
34e70 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  gs */.){.  int r
34e80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34e90 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75   PgHdr *pPg;.  u
34ea0 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20  8 noContent;    
34eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34ec0 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52 5f  * True if PAGER_
34ed0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
34ee0 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65   set */.  sqlite
34ef0 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
34f00 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Base;..  assert(
34f10 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
34f20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
34f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34f40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
34f50 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
34f60 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
34f70 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
34f80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34f90 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
34fa0 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 23 69 66 6e  Lock==1 );..#ifn
34fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34fc0 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f 2a 20  CONCURRENT.  /* 
34fd0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f  If this is an CO
34fe0 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63  NCURRENT transac
34ff0 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 70 61 67  tion and the pag
35000 65 20 62 65 69 6e 67 20 72 65 61 64 20 77 61 73  e being read was
35010 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  .  ** present in
35020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35030 6c 65 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  le when the tran
35040 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
35050 65 64 2c 0a 20 20 2a 2a 20 6d 61 72 6b 20 69 74  ed,.  ** mark it
35060 20 61 73 20 72 65 61 64 20 69 6e 20 74 68 65 20   as read in the 
35070 70 41 6c 6c 52 65 61 64 20 76 65 63 74 6f 72 2e  pAllRead vector.
35080 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
35090 72 2d 3e 70 41 6c 6c 52 65 61 64 20 26 26 20 70  r->pAllRead && p
350a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
350b0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  rigSize ){.    r
350c0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
350d0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41 6c  cSet(pPager->pAl
350e0 6c 52 65 61 64 2c 20 70 67 6e 6f 29 3b 0a 20 20  lRead, pgno);.  
350f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35100 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
35110 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
35120 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
35130 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
35140 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35150 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d 20  BKPT;.  pBase = 
35160 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35170 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
35180 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
35190 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
351a0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
351b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
351c0 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
351d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
351e0 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
351f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35200 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
35210 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35220 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
35230 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35240 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
35250 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
35260 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35270 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d     }.  }.  pPg =
35280 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
35290 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
352a0 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
352b0 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
352c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
352d0 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20  ==(*ppPage) );. 
352e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
352f0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
35300 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
35310 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
35320 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
35330 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66    noContent = (f
35340 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
35350 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a  _NOCONTENT)!=0;.
35360 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
35370 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
35380 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
35390 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
353a0 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
353b0 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
353c0 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
353d0 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
353e0 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
353f0 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
35400 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
35410 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
35420 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
35430 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
35440 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
35450 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
35460 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
35470 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
35480 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
35490 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
354a0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
354b0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
354c0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
354d0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42  e initialized. B
354e0 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65 72  ut first some er
354f0 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20 20  ror checks:.    
35500 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54 68  **.    ** (1) Th
35510 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
35520 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20 20  umber is 2^31.  
35530 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20 74    ** (2) Never t
35540 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ry to fetch the 
35550 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20 20  locking page.   
35560 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
35570 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
35580 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
35590 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
355a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
355b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
355c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
355d0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
355e0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
355f0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
35600 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ..    assert( !i
35610 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
35620 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ) || !MEMDB );. 
35630 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
35640 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
35650 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
35660 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29  o || noContent )
35670 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
35680 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
35690 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
356a0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
356b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
356c0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
356d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
356e0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
356f0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
35700 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
35710 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
35720 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
35730 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
35740 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
35750 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
35760 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
35770 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
35780 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
35790 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
357a0 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
357b0 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
357c0 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
357d0 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
357e0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
357f0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
35800 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
35810 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
35820 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
35830 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
35840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
35850 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
35860 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
35870 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
35880 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
35890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
358a0 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
358b0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
358c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
358d0 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
358e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
358f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
35900 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35910 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
35920 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
35930 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
35940 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
35950 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
35960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
35970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
35980 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
35990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
359a0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
359b0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
359c0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
359d0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
359e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
359f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
35a00 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46 72  e{.      u32 iFr
35a10 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
35a20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d           /* Fram
35a30 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57  e to read from W
35a40 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  AL file */.     
35a50 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
35a60 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35a80 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
35a90 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
35aa0 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
35ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35ac0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
35ad0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
35af0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
35b00 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
35b10 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
35b20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
35b30 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
35b40 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
35b50 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
35b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35b70 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
35b80 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35b90 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
35ba0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
35bb0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
35bc0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
35bd0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
35be0 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
35bf0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35c00 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
35c10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
35c20 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
35c30 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
35c40 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
35c50 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
35c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35c70 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
35c80 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54 68  MAP_SIZE>0./* Th
35c90 65 20 70 61 67 65 20 67 65 74 74 65 72 20 66 6f  e page getter fo
35ca0 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61  r when memory-ma
35cb0 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62  pped I/O is enab
35cc0 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  led */.static in
35cd0 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 0a 20  t getPageMMap(. 
35ce0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
35cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35d00 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
35d10 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
35d20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
35d30 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
35d40 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
35d50 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
35d60 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
35d70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
35d80 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
35d90 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
35da0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
35db0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
35dc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35dd0 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
35de0 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
35df0 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
35e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
35e10 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
35e20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  WAL file */..  /
35e30 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62  * It is acceptab
35e40 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64  le to use a read
35e50 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67  -only (mmap) pag
35e60 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65  e for any page e
35e70 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20  xcept.  ** page 
35e80 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  1 if there is no
35e90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35ea0 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41  on open or the A
35eb0 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a  CQUIRE_READONLY.
35ec0 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70    ** flag was sp
35ed0 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63  ecified by the c
35ee0 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f  aller. And so lo
35ef0 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20  ng as the db is 
35f00 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  not a .  ** temp
35f10 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f  orary or in-memo
35f20 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  ry database.  */
35f30 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d  .  const int bMm
35f40 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a 20  apOk = (pgno>1. 
35f50 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
35f60 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
35f70 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50  ER || (flags & P
35f80 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
35f90 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  Y)).  );..  asse
35fa0 72 74 28 20 55 53 45 46 45 54 43 48 28 70 50 61  rt( USEFETCH(pPa
35fb0 67 65 72 29 20 29 3b 0a 23 69 66 64 65 66 20 53  ger) );.#ifdef S
35fc0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
35fd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35fe0 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a 23  ->xCodec==0 );.#
35ff0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74 69  endif..  /* Opti
36000 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
36010 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
36020 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
36030 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
36040 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
36050 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
36060 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
36070 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
36080 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
36090 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
360a0 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
360b0 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
360c0 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
360d0 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
360e0 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
360f0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
36100 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
36110 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36120 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36130 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
36140 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
36150 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
36160 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
36170 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
36180 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
36190 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  t( pPager->hasHe
361a0 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20  ldSharedLock==1 
361b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
361c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
361d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
361e0 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
361f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36200 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
36210 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
36220 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
36230 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
36240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
36260 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
36270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36280 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d 61  }.  }.  if( bMma
36290 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30  pOk && iFrame==0
362a0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
362b0 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ata = 0;.    rc 
362c0 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
362d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
362e0 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
362f0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
36300 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
36310 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
36320 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
36330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36340 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
36350 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
36360 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
36370 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
36380 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
36390 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
363a0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
363b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
363c0 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
363d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
363e0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
363f0 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
36400 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
36410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36420 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
36430 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
36440 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
36450 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
36460 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d   pData);.      }
36470 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29  .      if( pPg )
36480 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
36490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
364a0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
364b0 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
364c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
364d0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
364e0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
364f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36500 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
36510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36520 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
36530 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  n getPageNormal(
36540 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
36550 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Page, flags);.}.
36560 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36570 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
36580 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70 61 67 65   */../* The page
36590 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 66   getter method f
365a0 6f 72 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  or when the page
365b0 72 20 69 73 20 61 6e 20 65 72 72 6f 72 20 73 74  r is an error st
365c0 61 74 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate */.static in
365d0 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 0a  t getPageError(.
365e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
365f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
36600 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
36610 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
36620 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
36630 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36640 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
36650 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
36660 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
36670 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36680 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
36690 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
366a0 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
366b0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
366c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
366d0 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20 55 4e 55  TER(pgno);.  UNU
366e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
366f0 61 67 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ags);.  assert( 
36700 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
36710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
36720 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
36730 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36740 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69  rCode;.}.../* Di
36750 73 70 61 74 63 68 20 61 6c 6c 20 70 61 67 65 20  spatch all page 
36760 66 65 74 63 68 20 72 65 71 75 65 73 74 73 20 74  fetch requests t
36770 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
36780 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 2e  e getter method.
36790 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
367a0 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65 72  agerGet(.  Pager
367b0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
367c0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
367d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
367e0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
367f0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
36800 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
36810 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
36820 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
36830 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
36840 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
36850 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
36860 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
36870 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
36880 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ags */.){.  retu
36890 72 6e 20 70 50 61 67 65 72 2d 3e 78 47 65 74 28  rn pPager->xGet(
368a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
368b0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Page, flags);.}.
368c0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
368d0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
368e0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
368f0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
36900 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
36910 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
36920 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
36930 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
36940 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
36950 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
36960 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
36970 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
36980 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
36990 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
369a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
369b0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
369c0 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
369d0 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
369e0 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
369f0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
36a00 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
36a10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
36a20 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
36a30 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
36a40 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
36a50 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
36a60 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
36a70 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
36a80 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
36a90 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
36aa0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
36ab0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
36ac0 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74  o pgno){.  sqlit
36ad0 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
36ae0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
36af0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
36b00 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
36b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36b20 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
36b30 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c  );.  pPage = sql
36b40 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
36b50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
36b60 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73   pgno, 0);.  ass
36b70 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c  ert( pPage==0 ||
36b80 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
36b90 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20  SharedLock );.  
36ba0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72  if( pPage==0 ) r
36bb0 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
36bc0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  n sqlite3PcacheF
36bd0 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65  etchFinish(pPage
36be0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
36bf0 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pPage);.}../*.
36c00 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
36c10 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
36c20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
36c30 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
36c40 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
36c50 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
36c60 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
36c70 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
36c80 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
36c90 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
36ca0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
36cb0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
36cc0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
36cd0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36ce0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
36cf0 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
36d00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
36d10 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50  tNull(DbPage *pP
36d20 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
36d30 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
36d40 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  Pg!=0 );.  pPage
36d50 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
36d60 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
36d70 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29  s & PGHDR_MMAP )
36d80 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61  {.    pagerRelea
36d90 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a  seMapPage(pPg);.
36da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
36db0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
36dc0 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  e(pPg);.  }.  pa
36dd0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
36de0 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69  d(pPager);.}.voi
36df0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
36e00 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
36e10 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71  {.  if( pPg ) sq
36e20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
36e30 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a  otNull(pPg);.}..
36e40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36e50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
36e60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
36e70 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
36e80 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
36e90 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
36ea0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
36eb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
36ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
36ed0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
36ee0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
36ef0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
36f00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
36f10 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
36f20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
36f30 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
36f40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
36f50 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
36f60 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
36f70 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
36f80 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
36f90 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
36fa0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
36fb0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
36fc0 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
36fd0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
36fe0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
36ff0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
37000 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
37010 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
37020 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
37030 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
37040 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
37050 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37060 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
37070 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
37080 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
37090 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
370a0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
370b0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
370c0 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
370d0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
370e0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
370f0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
37100 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
37110 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
37120 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
37130 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
37140 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
37150 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
37160 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
37170 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
37180 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
37190 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
371a0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
371b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
371c0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
371d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
371e0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
371f0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
37200 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
37210 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
37220 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
37230 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
37240 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
37250 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
37260 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
37270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
372a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
372b0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
372c0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
372d0 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
372e0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
372f0 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
37300 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37310 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37320 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
37330 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37340 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37360 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
37370 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
37380 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
37390 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
373a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
373b0 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
373c0 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
373d0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
373e0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
373f0 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
37400 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
37410 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
37420 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
37430 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
37440 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37450 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
37460 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37470 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
37480 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
37490 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
374a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
374b0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
374c0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
374d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
374e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
374f0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
37500 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37510 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
37520 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
37530 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
37540 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
37550 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
37560 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f   */.    if( !isO
37570 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37580 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
37590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
375a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
375b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
375c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65         sqlite3Me
375d0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
375e0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
375f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37600 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
37610 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
37620 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
37630 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e  EATE;.        in
37640 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20  t nSpill;..     
37650 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
37660 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
37670 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
37680 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
37690 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
376a0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
376b0 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53  L);.          nS
376c0 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
376d0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
376e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
376f0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
37700 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  |= SQLITE_OPEN_M
37710 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
37720 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
37730 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
37740 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
37750 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  }.          .   
37760 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
37770 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
37780 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73   still has the s
37790 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64  ame name as it d
377a0 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  id when.        
377b0 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  ** it was origin
377c0 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  ally opened. */.
377d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74          rc = dat
377e0 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70  abaseIsUnmoved(p
377f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
37800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
37820 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
37830 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20  alOpen (.       
37840 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
37850 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
37860 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
37870 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20  s, nSpill.      
37880 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
37890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
378a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
378b0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
378c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
378d0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
378e0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
378f0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
37900 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
37910 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
37920 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
37930 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
37940 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
37950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37960 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
37970 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
37980 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
37990 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
379a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
379b0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
379c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
379d0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
379e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
379f0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
37a00 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
37a10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
37a20 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
37a30 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
37a40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
37a60 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
37a70 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37a80 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
37a90 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
37aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
37ab0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37ac0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37ad0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
37ae0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
37af0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
37b00 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
37b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37b20 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
37b30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
37b40 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
37b50 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
37b60 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
37b70 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
37b80 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
37b90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
37ba0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
37bb0 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
37bc0 61 72 67 75 6d 65 6e 74 20 69 73 20 30 2c 20 74  argument is 0, t
37bd0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37be0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
37bf0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
37c00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
37c10 20 65 78 46 6c 61 67 20 69 73 20 3e 30 2c 20 74   exFlag is >0, t
37c20 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37c30 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
37c40 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
37c50 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
37c60 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
37c70 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
37c80 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
37c90 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 28 65 78  ed..**.** If (ex
37ca0 46 6c 61 67 3c 30 29 20 61 6e 64 20 74 68 65 20  Flag<0) and the 
37cb0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 57  database is in W
37cc0 41 4c 20 6d 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  AL mode, do not 
37cd0 74 61 6b 65 20 61 6e 79 20 6c 6f 63 6b 73 2e 0a  take any locks..
37ce0 2a 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  ** The transacti
37cf0 6f 6e 20 77 69 6c 6c 20 72 75 6e 20 69 6e 20 43  on will run in C
37d00 4f 4e 43 55 52 52 45 4e 54 20 6d 6f 64 65 20 69  ONCURRENT mode i
37d10 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
37d20 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
37d30 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
37d40 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
37d50 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
37d60 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
37d70 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
37d80 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
37d90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
37da0 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
37db0 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
37dc0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
37dd0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
37de0 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
37df0 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
37e00 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
37e10 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
37e20 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
37e30 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
37e40 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
37e50 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
37e60 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
37e70 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
37e80 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
37e90 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
37ea0 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
37eb0 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
37ec0 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
37ed0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
37ee0 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
37ef0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
37f00 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
37f10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
37f20 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
37f30 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
37f40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37f50 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
37f60 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
37f70 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37f80 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
37f90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
37fa0 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
37fb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
37fc0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
37fd0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
37fe0 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
37ff0 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
38000 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
38010 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
38020 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
38030 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
38040 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
38050 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
38060 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
38070 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
38080 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
38090 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
380a0 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
380b0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
380c0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
380d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
380e0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
380f0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
38100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
38110 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
38120 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
38130 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
38140 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
38150 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
38160 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
38170 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
38180 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
38190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
381a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
381b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
381c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28       }.        (
381d0 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45  void)sqlite3WalE
381e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
381f0 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
38200 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
38210 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
38220 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
38230 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
38240 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
38250 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
38260 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
38270 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
38280 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
38290 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
382a0 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
382b0 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
382c0 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
382d0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
382e0 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
382f0 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
38300 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
38310 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
38320 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 20 20   will call it.  
38330 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 65 78 46  */.      if( exF
38340 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  lag>=0 ){.      
38350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
38360 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
38370 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
38380 57 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Wal);.      }.  
38390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
383a0 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
383b0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
383c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
383d0 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
383e0 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
383f0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
38400 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
38410 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
38420 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
38430 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
38440 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
38450 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
38460 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
38470 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
38480 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
38490 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
384a0 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
384b0 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
384c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
384d0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
384e0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
384f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38500 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 3e 30  E_OK && exFlag>0
38510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
38520 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
38530 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
38540 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
38550 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
38560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38570 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
38580 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
38590 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
385a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
385b0 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
385c0 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
385d0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
385e0 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
385f0 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
38600 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
38610 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
38620 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
38630 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
38640 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
38650 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
38660 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
38670 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
38680 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
38690 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
386a0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
386b0 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
386c0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .